2017 / Swift 3.1 - GCD vs NSOperation

时间:2017-04-05 08:56:56

标签: ios swift grand-central-dispatch nsoperation

我正在深入研究并发性,并且已经广泛阅读了关于GCD和NSOperation的内容。然而,很多像canonic answer on SO这样的帖子已经有好几年了。

在我看来,NSOperation过去的主要优势是以某些性能为代价

  • “走的路”通常不仅仅是作为最高级抽象的简单派遣(建立在GCD之上)
  • 使任务操作(取消等)更容易
  • 轻松设置任务之间的依赖关系

鉴于GCD的DispatchWorkItem&特别是阻止取消/ DispatchGroup / qos除了你需要能够取消a的情况之外,是否真的有动机(明智的成本)再使用NSOperation进行并发任务何时开始执行或查询任务状态?

Apple似乎更加重视GCD,至少在他们的WWDC中(授予它比NSOperation更新)。

2 个答案:

答案 0 :(得分:4)

我看到他们每个人都有自己的目的。我刚刚在2015年WWDC上谈到了这个(高级NSOperations),我在这里看到两个要点。

运行时间&用户互动

来自谈话:

  

NSOperations的运行时间比你预期的块运行时间要长一些,所以块通常需要几纳秒,最多可能需要几毫秒才能执行。

     另一方面,NSOperations可以更长,从几毫秒到几分钟

他们谈论的例子是在WWDC应用程序中,其中存在一个依赖于登录用户的NSOperation。依赖关系NSOperation提供登录视图控制器并等待用户进行身份验证。完成后,NSOperation结束,NSOperationQueue恢复它的工作。我认为你不想在这种情况下使用GCD。

<强>子类

由于NSOperations只是类,因此您可以将它们子类化以从中获得更多的可重用性。 GCD无法做到这一点。

示例:(使用上面的WWDC登录方案)

您的代码库中有许多NSOperations与要求对其进行身份验证的用户交互相关联。 (喜欢这个例子中的视频。)你可以扩展NSOperation来创建AuthenticatedOperation,然后让所有那些NSOperations扩展这个新类。

答案 1 :(得分:2)

首先,NSOperationQueue允许您将操作排入队列,即使用start方法,cancel方法和一些方法进行某种异步操作可观察的属性,而使用调度队列,可以将闭包函数提交到调度队列,然后执行该队列

“操作”在语义上与块(或闭包,函数)根本不同。一个操作有一个底层的异步任务,而一个块(闭包或函数)就是那个。

接近NSOperation的是异步函数,例如:

func asyncTask(param: Param, completion: (T?, Error?) ->())

现在使用 Futures ,我们可以定义相同的异步函数,如:

func asyncTask(param: Param) -> Future<T>

使得这种异步函数非常方便。

由于期货具有mapflatMap等组合函数,我们可以非常轻松地“模仿”NSOperation的“依赖”功能,只需更强大,更强大简洁,易懂的方式。

我们还可以使用几行代码来实现某种NSOperationQueue,只需要基于GCD,比如“TaskQueue”,并且具有基本相同的功能,例如“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() 
}

所以,恕我直言,我真的没有理由使用笨重的NSOperationNSOperationQueue,并且没有任何理由继续使用NSOperation,这是非常复杂和令人惊讶的难度,除非你不要关心数据竞赛。