Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@jeudesprits
Created October 28, 2019 12:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jeudesprits/39c1e97bfda4e7a7b739c2deb50b9c3b to your computer and use it in GitHub Desktop.
Save jeudesprits/39c1e97bfda4e7a7b739c2deb50b9c3b to your computer and use it in GitHub Desktop.
final class GetPreferredImageOperation: PSGroupOperation {
private let taskOperation: PSURLSessionTaskOperation
private let downsampleOperation: DownsampleImageOperation
private let adapterOperation: BlockOperation
private let finishOperation: BlockOperation
let identifier: UUID
init(
identifier: UUID,
underlyingQueue: DispatchQueue? = nil,
session: URLSession? = nil,
at url: URL,
to pointSize: CGSize,
withScale scale: CGFloat,
completionHandler: ((UIImage?) -> Void)? = nil
) {
self.identifier = identifier
// Task
var request = URLRequest(url: url)
request.networkServiceType = .responsiveData
if let session = session {
taskOperation = PSURLSessionTaskOperation(session: session, request: request)
} else {
taskOperation = PSURLSessionTaskOperation(request: request)
}
// Downsample
downsampleOperation = DownsampleImageOperation(under: pointSize, withScale: scale)
downsampleOperation.add(PSNoCancelledDependencies())
// Adapter
adapterOperation = BlockOperation { [unowned taskOperation, unowned downsampleOperation] in
Thread.current.name = "Fetch"
downsampleOperation.downsamplingImageData = taskOperation.taskData
}
// Finish
finishOperation = BlockOperation { [unowned downsampleOperation] in
completionHandler?(downsampleOperation.downsampledImage)
}
// Add dependencies
adapterOperation.addDependency(taskOperation)
downsampleOperation.addDependency(adapterOperation)
finishOperation.addDependency(downsampleOperation)
// Super
if let underlyingQueue = underlyingQueue {
super.init(
underlyingQueue: underlyingQueue,
operations: [taskOperation, adapterOperation, downsampleOperation, finishOperation]
)
} else {
super.init(operations: [taskOperation, adapterOperation, downsampleOperation, finishOperation])
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment