DispatchQueue.main.async和Dispatch.main.asyncAfter(.now(),{})之间是否存在差异
我的问题是关于 asyncAfter与.now()作为延迟时间。
第二个问题是两个方法是否允许当前UI线程在下一个runloop中执行闭包之前结束?
我发现在前者的闭包中使用UIAlertController显示警告会导致一些不稳定的行为。对于后者,加上延迟约0.3秒,它运作良好。
答案 0 :(得分:0)
答案 1 :(得分:0)
没有区别。我通过调用它进行了100次测试,并且回调按照他们排队的相同顺序执行。
我通过拥有100个队列进一步测试,看看它如何与并行性行为,并且回调仍然按照它们排队的顺序执行。因此,结论是asyncAfter(.now())与async相同:
func testOneThread() {
var lastCallbackRun = 0
for i in 1...100 {
DispatchQueue.main.asyncAfter(.now()) {
assert(lastCallbackRun < i)
lastCallbackRun = i
if i == 100 {
NSLog("done")
}
}
}
}
func testAsync() {
for _ in 0...100 {
let q = DispatchQueue(label: "whatever")
q.async(execute: testOneThread)
Unmanaged<DispatchQueue>.passRetained(q)
}
}
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
testAsync()
// The rest of it.
}
}