- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我意识到使用 DispatchQueue.main.asyncAfter(deadline: .now())
和 perform(_:with:afterDelay:0)
是有区别的当主队列“忙”时。
请注意,在我的情况下,perform(_:with:afterDelay:)
是从主队列调用的。
看起来 DispatchQueue.main.asyncAfter(deadline: .now())
在下一个运行循环中立即执行任务而不关心主队列但是 perform(_:with:afterDelay :)
0 延迟将等待并仅在主队列“空闲”时执行任务(可能不会在下一个运行循环中调用)。
根据 Apple 文档 perform(_:with:afterDelay:)
Specifying a delay of 0 does not necessarily cause the selector to be performed immediately. The selector is still queued on the thread’s run loop and performed as soon as possible.
我不确定我是否理解正确,所以任何人都可以帮我解释一下它们之间到底有什么区别吗? 尽快执行是什么意思?
我发现了同样的问题 here但似乎这不是我想要的。
最佳答案
我创建了这个独立测试来探索这个主题。
class ViewController: UIViewController {
@objc func test1(_ info: Any) {
guard let str = info as? String else { return }
sleep(1)
print(str)
if str != "selector 3" {
self.perform(#selector(test1), with: "selector 3", afterDelay: 0)
}
DispatchQueue.main.asyncAfter(deadline: .now()) {
sleep(1)
print("dispatch 4 queued by \(str)")
}
}
@IBAction func test(_ sender: UIButton) {
print("begin test")
self.perform(#selector(test1), with: "selector 1", afterDelay: 0)
DispatchQueue.main.asyncAfter(deadline: .now()) {
DispatchQueue.main.asyncAfter(deadline: .now()) {
sleep(1)
print("dispatch 3")
}
sleep(1)
print("dispatch 1")
}
self.perform(#selector(test1), with: "selector 2", afterDelay: 0)
DispatchQueue.main.asyncAfter(deadline: .now()) {
sleep(1)
print("dispatch 2")
}
print("end test")
}
}
结果输出:
begin test
end test
dispatch 1
dispatch 2
selector 1
selector 2
dispatch 3
dispatch 4 queued by selector 1
dispatch 4 queued by selector 2
selector 3
selector 3
dispatch 4 queued by selector 3
dispatch 4 queued by selector 3
注意事项:
begin test
和 end test
在显示 perform(_:with:afterDelay:)
和 的任何其他输出之前打印DispatchQueue.main.asyncAfter
排队并稍后运行。DispatchQueue
在 perform
之前运行,即使它们以不同的顺序排队也是如此。dispatch 3
不会跳到 selector 1
和 selector 2
之前,即使它在 dispatch 1
打印。
结论:
Dispatch.main.asyncAfter
和 perform(_:with:afterDelay:)
都将它们的选择器/闭包排队等待稍后执行。由于您在主线程上运行 perform(_:with:afterDelay:)
,它使用主队列进行调度。
出于某种(对我而言)未知的原因,Dispatch.main.asyncAfter(0)
调用在 perform(_:with:afterDelay:0)
调用之前排队,当在同一个运行循环中排队。注意:如果在 Dispatch.main.asyncAfter
中添加任何延迟,它将在 perform(_:with:afterDelay:)
之后排队。例如,尝试使用 .now() + .milliseconds(1)
。
尽快执行 只是表示它们按队列顺序排队和处理的另一种说法。根据任务在前面队列中花费的时间,在最终处理任务之前可能需要多次运行运行循环。
关于IOS - DispatchQueue.main.asyncAfter(deadline : . now()) 和 perform(_:with:afterDelay:) 之间的区别,延迟为 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52162558/
我正在尝试为 TextView 制作动画,让字符串字符一个接一个地出现,然后在 0.5 秒延迟后从第一个字符开始一个接一个地消失。 我很接近,我遇到的唯一问题是第一个字符会立即被删除,所以就好像它从未
我正在尝试运行一个简单的 iOS 应用程序,该应用程序会在指定时间后将通知推送到用户屏幕。 到目前为止,这是我所拥有的(从另一个线程借来的): DispatchQueue.global(qos: .b
在我的 iPad 应用程序中,我试图让 tableView 以预定的间隔滚动。为此,我创建了一段代码,为每个滚动创建一个闭包。然而,关闭的执行时间比我想要的时间晚了几秒钟。这是一个简化的 Playgr
最终,我很快就在 swift 中使用了 asyncAfter 特性,它确实有一些延迟,而且看起来与普通代码不同。 异步代码: DispatchQueue.main.asyncAfter(deadlin
我正在开发一个应用程序,其中我尝试调试的 403 禁止错误实际上是由您每分钟可以向端点发出的请求数量的上限引起的(愚蠢的我)。 很好,我决定将我的网络请求放到 DispatchQueue 上(无论如何
我想知道 DispatchQueue.asyncAfter(deadline:execute:) 在进入后台时的行为。我试图在 documentation 中找到更多信息,但那里什么也没有。 让我们假
我试图在延迟后调用一个函数。在 iOS10 上,我可以使用 Timer.scheduledTimer,它确实会在给定延迟后调用我的闭包。但是,在 iOS9 上,我使用的是 DispatchQueue.
所以我有一个带有单选按钮的应用程序来检查任务,只要我让动画完成,一切都会按预期工作,但如果我同时按下两个按钮,我会收到错误: libc++abi.dylib: terminating with unc
在我的游戏中, meteor 从天而降。 spawnMeteorite 函数在游戏开始时被调用,并在满足延迟后调用自身,此时陨石之间的新延迟比以前略短。 func spawnMeteorite(tim
这个问题在这里已经有了答案: How do I run Asynchronous callbacks in Playground (8 个答案) 关闭 4 年前。 我在 Playground 中运行
我有一个调度异步,我希望屏幕上弹出 4 个警报......然后在显示新警报之前每个警报都被关闭。 (我在我的警报之间设置了 3 秒的延迟) class ViewController: UIViewCo
我在修改对象的属性后调用 DispatchQueue.main.asyncAfter 方法(我用 KVO 触发它)。我只显示一秒钟的确认 View ,然后运行一个在 UI 上做其他事情的 block
我提出了以下结构,作为在网络连接速度较慢时提醒用户的一种方式。 当函数要调用服务器时,它会创建一个 ResponseTimer。这会设置延迟通知,仅当 responseTimer var isOn =
我正在使用 AVAudioPlayer 播放唱片。在每个回放 session 之间我有 0 到 10 秒的间隔。为了制作这个间隔,我正在使用 AVAudioPlayerDelegate 并且播放完成后
我很难理解 DispatchSourceTimer 之间的主要区别, Timer和 asyncAfter (在我的例子中,调度一个需要每 X 秒运行一次的任务,尽管了解定时器的差异可能对有用)(或者除
在 Swift 的早期版本中,此代码可以完美运行。 DispatchQueue.main.asyncAfter(deadline: .now() + delay) { timer in sel
我想在调用 deinit 时退出“DispatchQueue.main.asyncAfter”。 subView.swift DispatchQueue.main.asyncAfter(deadlin
这个问题在这里已经有了答案: Cancel a timed event in Swift? (7 个答案) 关闭 5 年前。 描述: 我目前正在使用以下代码来查看用户是否已停止在搜索栏中键入内容。每
这个问题已经有答案了: How to prevent a Command Line Tool from exiting before asynchronous operation completes
下面的延迟代码在 iOS 14.0 以下运行良好,但在 iOS 14.0 模拟器中,它每 2 秒重复调用一次。有什么我错过的吗? DispatchQueue.main.asyncAfter(dea
我是一名优秀的程序员,十分优秀!