dispatch_after会阻塞主线程吗?

3

我正在设置一个定时器,以便在一秒钟后重置键盘扩展的值。问题是,我觉得以下调用正在阻塞我的UI:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
    [self resetDoubleTapBool];
})

有没有异步的方式来完成这个操作,或者一般来说更好的方法?谢谢!

2
不,它不会。它就像一个提醒。当闹钟响起时,它将选择给定的队列;在您的情况下是“(dispatch_get_main_queue()”,并触发该块。 - Abubakr Dar
3
我觉得编程和你的感受无关。如果你不确定,就去衡量它。 - matt
@matt 很好的观点。肯定想了解其他替代方案和用例。谢谢,一定会使用工具。 - KingPolygon
2个回答

6
dispatch_after()调用本身不会阻塞任何进程。在约定的时间点(或者稍后),块将被提交到主队列。提交它不会阻塞主线程。当主线程下一次运行其运行循环或在dispatch_main()中处于空闲状态时,它将执行该块。 如果你的-resetDoubleTapBool方法需要较长的时间,那么它可能会使你的UI停滞。这与在主线程上运行的任何代码都是相同的,而与dispatch_after()或GCD的任何其他部分无关。

哎呀,有点奇怪。我一定会进行一些性能测试,因为-resetDoubleTapBool只是改变了一个布尔值。但也许还有其他的事情发生了。 - KingPolygon
你是否有很多次调用 dispatch_after() 函数的机会?基本上,你是否正在使用廉价但是总体昂贵的代码块淹没主队列? - Ken Thomases

0
根据函数文档

此函数等待指定时间,然后异步将块添加到指定队列中。


1
抱歉:我投了反对票,因为这个回答没有解答问题(线程是否会被阻塞),只是引用了文档中含糊不清的参考。短语“等待指定时间”很容易被误解为线程将被阻塞直到那个时间,但事实并非如此。(术语“等待”在其他情况下经常被使用,例如dispatch_group_wait,意思是队列会一直被阻塞直到未来某个时间点,与此处使用的术语不同。)总之,这个回答根本没有解答问题。 - Rob
@Rob:好的。作为一个技术人员,当我阅读这份苹果关于这个命令的文档时,它非常清晰明了。但是如果你是这样解释的话,我认为你可能有一定的观点。然而,你加入dispatch_group_wait来支持你的论点是不相关的,甚至可笑的。"等待"这个词在完全不同的上下文中使用。一个是描述的一部分,另一个是命令本身的名称。顺便说一句:我没有根据命令的名称来回答问题,而是根据苹果的明显文件支持我的答案。 - user523234

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接