ios - 完成处理程序和操作队列

标签 ios swift nsoperationqueue swift5 completionhandler

我正在尝试执行以下方法,

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

最佳答案

在 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:) 在下载任务启动后立即返回,而不等待请求完成?在这种情况下,依赖性和障碍都不会按照您想要的方式工作。

在操作中包装网络请求时,您需要确保使用异步 Operation 子类(例如 https://stackoverflow.com/a/32322851/1271826 )。

关于ios - 完成处理程序和操作队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60035462/

相关文章:

iOS 企业部署 : Clicking on itms-services link results in "Cannot connect to [domain]" error

iphone - 快速枚举中的突变?

ios - Swift:在应用程序之间共享身份验证状态

ios - 并发(dispatchqueue)测试未按预期进行 ios/swift

ios - NSArray setCompletionBlock 内部泄漏

iphone - NSOperations 队列和处理应用程序退出

ios - 使用大标题开始滚动时 UICollectionView 跳转

ios - Xcode12 CoreNFC 模拟器库未加载

ios - 在核心数据中保存一对多关系,但关闭模拟器后关系中只有一项。控制台 Swift 中的错误

ios - 任何超过 255 秒的任务都会导致 GCD 崩溃