まず第一に、NSOperationQueue
ディスパッチキューと1がブロックを提出することができますが、それは、start
方法、cancel
方法といくつかの観察可能な特性を持つ非同期操作のいくつかの並べ替えで、あなたは操作をエンキューしましょうかクロージャまたはファンクションをディスパッチキューに追加して実行します。
「操作」は、ブロック(またはクロージャ、関数)と意味的に基本的に異なります。操作には基本的な非同期タスクがありますが、ブロック(クロージャーまたは関数)はそれだけです。 NSOperation
に近づく何
は、しかし、例えば、非同期機能である:
func asyncTask(param: Param, completion: (T?, Error?) ->())
今先物で我々は次のように同じ非同期関数を定義することができます。
func asyncTask(param: Param) -> Future<T>
このような非同期関数は非常に便利です。
先物ようにmap
とflatMap
ようコンビネータ機能を持っているので、我々は非常に簡単にちょうどより強力な、より簡潔で、より分かりやすい方法で、NSOperation
の「依存」機能を「エミュレート」することができます。
は、我々はまた、GCDのみに基づいて数行のコードで
NSOperationQueue
のいくつかの並べ替えを実装することができ
は、「maxConcurrentTasks」のような「タスクキュー」と基本的に同じ機能を持つが、言うと(タスク機能をエンキューするためにそれを使用することができます操作ではなく)、より強力で、より簡潔で、より分かりやすい方法でもあります。 ;)
を解約操作を得るために、あなたはNSOperation
のサブクラスを作成する必要があります - インライン - あなたは非同期機能「広告-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()
}
、実際に使用する理由はありませんIMHO不格好NSOperation
とNSOperationQueue
、と理由サブクラス化のために、それ以上はありませんNSOperation
これは、データ競合を気にしない限り、非常に精巧で驚くほど難しいものです。