我正在设置一个定时器,以便在一秒钟后重置键盘扩展的值。问题是,我觉得以下调用正在阻塞我的UI:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self resetDoubleTapBool];
})
有没有异步的方式来完成这个操作,或者一般来说更好的方法?谢谢!
我正在设置一个定时器,以便在一秒钟后重置键盘扩展的值。问题是,我觉得以下调用正在阻塞我的UI:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self resetDoubleTapBool];
})
dispatch_after()
调用本身不会阻塞任何进程。在约定的时间点(或者稍后),块将被提交到主队列。提交它不会阻塞主线程。当主线程下一次运行其运行循环或在dispatch_main()
中处于空闲状态时,它将执行该块。
如果你的-resetDoubleTapBool
方法需要较长的时间,那么它可能会使你的UI停滞。这与在主线程上运行的任何代码都是相同的,而与dispatch_after()
或GCD的任何其他部分无关。-resetDoubleTapBool
只是改变了一个布尔值。但也许还有其他的事情发生了。 - KingPolygondispatch_after()
函数的机会?基本上,你是否正在使用廉价但是总体昂贵的代码块淹没主队列? - Ken Thomases此函数等待指定时间,然后异步将块添加到指定队列中。
dispatch_group_wait
,意思是队列会一直被阻塞直到未来某个时间点,与此处使用的术语不同。)总之,这个回答根本没有解答问题。 - Rob