首先,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
,这是相当复杂和令人惊讶的困难,除非你不关心数据竞赛。