簡體   English   中英

完成處理程序和操作隊列

[英]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

在 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 13 之前的方式是觀察操作隊列的operationCount屬性

var observation : NSKeyValueObservation?

...

observation = operationQueue.observe(\.operationCount, options: [.new]) { observed, change in
        if change.newValue == 0 {
            print("operations finished")
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM