gpt4 book ai didi

iphone - performSelector :withObject:afterDelay: and dispatch_after 之间的权衡是什么

转载 作者:IT王子 更新时间:2023-10-29 08:03:38 24 4
gpt4 key购买 nike

我遇到的唯一功能差异是我可以取消使用 performSelector:withObject:afterDelay: 安排的消息。我不知道有什么方法可以取消提交给 dispatch_after 的 block 。 (如果有我不知道的方法,请告诉我)。

我想了解更多:

  • 功能权衡(还有什么可以用一个界面完成而不是另一个?)
  • 性能权衡(一种实现是否更有效?在哪些情况下?)
  • 风格权衡(我是否应该为某些任务选择一个界面以更好地遵循常见的风格或约定?)

最佳答案

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

但总的来说,我认为它们总体上解决了不同的需求。 GCD 允许对代码的并发执行进行更精细的分级控制。您可以在队列上安排 block 、删除它们、暂停、恢复等。一般来说,这是一个更广泛的主题。此外,GCD 还提供了更多的同步选项。

就与 performSelector 的比较而言,我认为 dispatch_after 的一个优点是可以在不需要定义选择器的情况下调度 block 。参见 this discussion .

总而言之,我对 GCD 没有太多经验,但我想说的是,除了 block 调度之外,当您只需要在 UI 中延迟某些选择器的执行时,通常对并发性没有太多要求,我会使用 performSelector

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

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

关于性能,我真的不知道performSelector里面做了什么,但是如果它调度一个线程,那么苹果states用 GCD 调度一个 block 只需要 15 条指令,而创建一个线程需要几百条指令。

除了performSelector,别忘了您还可以选择使用NSOperationQueue,它基于GCD,有一些明显的开销但不是那么大,他们说。 NSOperationQueue当然提供了取消的可能性。

关于iphone - performSelector :withObject:afterDelay: and dispatch_after 之间的权衡是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6205998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com