performSelector:withObject:afterDelay:和dispatch_after之间有什么权衡

And*_*ger 21 iphone objective-c grand-central-dispatch ios4 ios

我遇到的唯一功能差异是我可以取消预定的消息performSelector:withObject:afterDelay:.我不知道取消提交的块的方法dispatch_after.(请告诉我是否有办法做到这一点,我不知道).

我想了解更多:

  • 功能权衡(一个接口可以实现什么,而另一个接口不能实现?)
  • 性能权衡(一种实现更有效吗?在哪些情况下?)
  • 风格权衡(我是否更喜欢某个任务的界面,以更好地遵循常见的风格或约定?)

ser*_*gio 19

dispatch_afterGrand Central Dispatch的一部分,它是iOS的扩展,旨在改善多核硬件上的并发代码执行.

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

至于与之比较performSelector,我认为dispatch_after正确的一个优点是可以在不需要定义选择器的情况下调度块.见这个讨论.

总而言之,我对GCD没有多少经验,但我会说,除了块调度之外,当你只需要在UI中延迟一些选择器执行时,一般不需要并发性,我会用performSelector.

如果你考虑它,performSelector会给你一个非常差的并发性,因为它只是在最短的时间后调度你的选择器在运行循环上执行.另一方面,dispatch_after给你一个原则上似乎在纳秒级别的控件(!!这是我从Apple文档获得的,但我从未使用它,我不认为在iPhone上你会得到那个,可能在MacOS上).

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

至于性能,我真的不知道performSelector里面是什么,但是如果它调度一个线程,那么Apple 声称用GCD调度一个块只需要15条指令,而创建一个线程要花费数百个.

他们说,除此之外performSelector,不要忘记你可以选择使用NSOperationQueue,这是基于GCD,并有一些开销,但不是那么大.NSOperationQueue肯定提供取消的可能性.

  • 你也可以创建一个可以取消的gcd计时器:http://www.fieryrobot.com/blog/2010/07/10/a-watchdog-timer-in-gcd/ (5认同)
  • 如果我正确理解塞尔吉奥,他建议释放队列将取消所有待处理的块执行.事实并非如此......请参阅http://developer.apple.com/library/mac/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html,其中说明:当您的应用程序不再需要调度队列时,它应该使用dispatch_release函数释放它.提交到队列的任何挂起块都会保留对该队列的引用,因此在完成所有挂起块之前不会释放队列. (2认同)