完成处理程序和操作队列
Completion handlers and Operation queues
我正在尝试执行以下方法,
let operationQueue = OperationQueue()
operationQueue.maxConcurrentOperationCount = 10
func registerUser(completionHandler: @escaping (Result<Data, Error>) -> Void) -> String {
self.registerClient() { (result) in
switch result {
case .success(let data):
self.downloadUserProfile(data.profiles)
case .failure(let error):
return self.handleError(error)
}
}
}
func downloadUserProfile(urls: [String]) {
for url in urls {
queue.addOperation {
self.client.downloadTask(with: url)
}
}
}
我正在检查是否可以在所有操作完成时收到通知,然后我可以在那里调用成功处理程序。
我尝试查看建议使用
的苹果开发文档
queue.addBarrierBlock {
<#code#>
}
但这仅适用于 iOS 13.0
前iOS13的方式是观察operationCount
属性的操作队列
var observation : NSKeyValueObservation?
...
observation = operationQueue.observe(\.operationCount, options: [.new]) { observed, change in
if change.newValue == 0 {
print("operations finished")
}
}
}
Pre iOS 13,我们会使用依赖项。声明一个完成操作,然后在为网络请求创建操作时,将这些操作定义为完成操作的依赖项。
let completionOperation = BlockOperation { ... }
let networkOperation1 = ...
completionOperation.addDependency(networkOperation1)
queue.addOperation(networkOperation1)
let networkOperation2 = ...
completionOperation.addDependency(networkOperation2)
queue.addOperation(networkOperation2)
OperationQueue.main.addOperation(completionOperation)
话虽如此,您在执行操作时应该非常小心。我是否正确推断 downloadTask(with:)
returns 在下载任务启动后立即开始并且不等待请求完成?在那种情况下,依赖关系和障碍都不会按照您想要的方式工作。
在操作中包装网络请求时,您需要确保使用异步 Operation
子类(例如 )。
我正在尝试执行以下方法,
let operationQueue = OperationQueue()
operationQueue.maxConcurrentOperationCount = 10
func registerUser(completionHandler: @escaping (Result<Data, Error>) -> Void) -> String {
self.registerClient() { (result) in
switch result {
case .success(let data):
self.downloadUserProfile(data.profiles)
case .failure(let error):
return self.handleError(error)
}
}
}
func downloadUserProfile(urls: [String]) {
for url in urls {
queue.addOperation {
self.client.downloadTask(with: url)
}
}
}
我正在检查是否可以在所有操作完成时收到通知,然后我可以在那里调用成功处理程序。
我尝试查看建议使用
的苹果开发文档queue.addBarrierBlock {
<#code#>
}
但这仅适用于 iOS 13.0
前iOS13的方式是观察operationCount
属性的操作队列
var observation : NSKeyValueObservation?
...
observation = operationQueue.observe(\.operationCount, options: [.new]) { observed, change in
if change.newValue == 0 {
print("operations finished")
}
}
}
Pre iOS 13,我们会使用依赖项。声明一个完成操作,然后在为网络请求创建操作时,将这些操作定义为完成操作的依赖项。
let completionOperation = BlockOperation { ... }
let networkOperation1 = ...
completionOperation.addDependency(networkOperation1)
queue.addOperation(networkOperation1)
let networkOperation2 = ...
completionOperation.addDependency(networkOperation2)
queue.addOperation(networkOperation2)
OperationQueue.main.addOperation(completionOperation)
话虽如此,您在执行操作时应该非常小心。我是否正确推断 downloadTask(with:)
returns 在下载任务启动后立即开始并且不等待请求完成?在那种情况下,依赖关系和障碍都不会按照您想要的方式工作。
在操作中包装网络请求时,您需要确保使用异步 Operation
子类(例如