DispatchQueue.main.async和Dispatch.main.asyncAfter(.now(),{})之间的区别

时间:2017-07-07 12:13:12

标签: swift multithreading

DispatchQueue.main.async和Dispatch.main.asyncAfter(.now(),{})之间是否存在差异

我的问题是关于 asyncAfter与.now()作为延迟时间。

第二个问题是两个方法是否允许当前UI线程在下一个runloop中执行闭包之前结束?

我发现在前者的闭包中使用UIAlertController显示警告会导致一些不稳定的行为。对于后者,加上延迟约0.3秒,它运作良好。

2 个答案:

答案 0 :(得分:0)

如果您选择将asyncAfter.now一起使用,则没有区别。这是证明。这两个函数应该在被调用后立即开始执行

enter image description here

答案 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.
  }
}