我正在尝试采取以下方法,

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)
        }
    }
}

我正在检查是否可以在所有操作完成后得到通知,然后可以在那里致电成功处理程序。

我尝试检查了建议使用的Apple开发文档
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/

10-11 00:42
查看更多