performSelector:withObject:afterDelay:和dispatch_after之间的折衷是什么?

我遇到的唯一的function差异是,我可以取消与performSelector:withObject:afterDelay: 我不知道如何取消提交给dispatch_after的块。 (请让我知道是否有办法做到这一点,我不知道)。

我想知道更多关于:

  • function的权衡(还有什么可以用一个接口而不是其他的?)
  • 性能权衡(一个实现更有效率?在哪些情况下?)
  • 风格权衡(我应该更喜欢一个接口的某些任务,以更好地遵循常见的风格或惯例?)

dispatch_after是新的Grand Central Dispatch的一部分 ,它是iOS的扩展,旨在改进多核硬件上的并发代码执行。

但总的来说,我认为他们总体上满足不同的要求。 GCD允许对代码的并发执行进行更精细的分级控制。 您可以安排队列中的块,删除它们,暂停,恢复等。这是一个更广泛的话题,在这里将被综合考虑。 另外,GCD提供了更多的同步选项。

至于与performSelector的比较,我认为dispatch_after正确的一个优点是可以调度一个块而不需要定义一个select器。 看到这个讨论 。

总而言之,我并没有太多的GCD经验,但是我想说的是,除了块调度之外,当你简单地需要延迟你的UI中的一些select器执行时,没有太多的一般的并发需求,我会使用performSelector

如果你仔细想想, performSelector会给你一个非常差的并发性,因为它只是在最短的时间内安排你的select器在运行循环上执行。 另一方面, dispatch_after给你一个原则上在纳秒水平上的控制(!!这是我从苹果文档中得到的,但我从来没有使用它,我不认为在iPhone上你会得到那可能在MacOS上)。

编辑:关于取消dispatch_release一个块,我从来没有试图从队列中dispatch_release块,但有一种可能性, dispatch_release也允许你控制。 如果没有,你可以为你想要取消的块定义自定义队列,并释放整个队列(在块开始执行之前),如果这对你有意义的话。

至于性能,我真的不知道在里面select了什么,但是如果它调度了一个线程,那么苹果说 ,用GCD调度一个块只花费15条指令,而创build一个线程需要花费几百条指令。

除了performSelector之外,不要忘了你可以select使用基于GCD的NSOperationQueue ,并且有一些额外的开销,但是没有那么大,他们说。 NSOperationQueue当然提供取消的可能性。

使用GCD代替performSelector另一大优点是能够非常简单地使用多个局部variables作为块操作的一部分。 如果要推迟一个方法的执行,该方法需要多个参数,直到稍后使用performSelector ,则必须将要用于另一个对象(例如数组)的参数封装起来。 随着dispatch_after你可以很简单地传递任何数量的局部variables到块。 这也适用于非对象,如果没有首先包装在一个对象中(例如传递一个CGRectNSValue ,就不能传递给performSelector调用。 GCD允许您将基元,结构体和对象传递给要推迟的操作。