【发布时间】:2018-09-04 08:59:13
【问题描述】:
我意识到当主队列“忙”时使用DispatchQueue.main.asyncAfter(deadline: .now()) 和perform(_:with:afterDelay:0) 是有区别的。
请注意,在我的情况下,perform(_:with:afterDelay:) 是从主队列调用的。
似乎DispatchQueue.main.asyncAfter(deadline: .now()) 在下一个运行循环中立即执行任务而不关心主队列,但延迟为 0 的 perform(_:with:afterDelay:) 将等待并仅在主队列“空闲”时执行任务(也许不会在下一个运行循环中调用)。
根据perform(_:with:afterDelay:)的Apple文档
指定延迟为 0 并不一定会导致选择器立即执行。选择器仍在线程的运行循环中排队并尽快执行。
我不确定我是否正确理解它们,所以谁能帮我解释一下它们之间的本质区别是什么? 尽快执行是什么意思?
我发现了同样的问题here,但似乎不是我想要的。
【问题讨论】:
-
猜测:main.asyncAfter 在主线程上运行,而 perform 方法在 NSObject 下,根据文档它在当前线程上执行(并不意味着主线程,它可以是你已经初始化的任何线程NSObject)。可能是您想在其他线程中延迟一段时间后执行一些操作。但是,如果您想确保要在主线程上运行,那么还有另一种方法 performSelector(onMainThread:with:waitUntilDone:modes:) 但它不提供延迟
-
@SahilManchanda 感谢您的建议并指出有关在主队列上调用
perform(_:with:afterDelay:)的问题。我忘了在问题中提到它。我已更新我的问题以使其更清楚。
标签: ios objective-c swift grand-central-dispatch foundation