首先,NSOperationQueue
讓你排隊操作,也就是說,某種具有start
法,cancel
方法和一些可觀察性異步操作的,同時與調度隊列中的一個可以提交一個塊或一個關閉或函數到一個調度隊列,然後將執行。
「操作」是比塊(或封閉件,功能)語義根本不同的。一個操作有一個底層的異步任務,而一個塊(閉包或函數)就是這樣。
什麼接近的NSOperation
,雖然是一個異步功能,如:
func asyncTask(param: Param, completion: (T?, Error?) ->())
現在用期貨我們可以這樣定義同異步函數:
func asyncTask(param: Param) -> Future<T>
這使得這種異步功能非常方便。
由於期貨有像map
和flatMap
等組合子功能,我們可以很容易地「模仿」的NSOperation
「依賴」功能,只需在一個更強大,更簡潔,更易於理解的方式。
我們也可以實現某種NSOperationQueue
與僅基於GCD基礎的幾行代碼,說「任務隊列」,並使用基本相同的功能,如「maxConcurrentTasks」,可以用它來排隊任務功能(而不是操作),只是一種更強大,更簡潔,更易理解的方式。 ;)
爲了獲得可取消操作,您需要創建NSOperation
的子類 - 而您可以創建異步函數「ad-hod」 - 內聯。
此外,由於取消是一個獨立的概念,我們可以假設,存在一些庫,其實現完全基於GCD,它以通常的方式解決了這個問題;)可能看起來像這樣:
self.cancellationRequest = CancellationRequest()
self.asyncTask(param: param, cancellationToken: cr.token).map { result in
...
}
及更高版本:
override func viewWillDisappear(_ animated: animated) {
super.viewWillDisappear(animated)
self.cancellationRequest.cancel()
}
因此,恕我直言,真的沒有理由使用笨重NSOperation
和NSOperationQueue
,而且也沒有任何理由更多的子類NSOperation
,這是相當複雜和令人驚訝的困難,除非你不關心數據競賽。