【问题标题】:Difference between DispatchQueue.main.async and Dispatch.main.asyncAfter(.now(),{})DispatchQueue.main.async 和 Dispatch.main.asyncAfter(.now(),{}) 之间的区别
【发布时间】:2017-07-07 12:13:12
【问题描述】:

DispatchQueue.main.async 和 Dispatch.main.asyncAfter(.now(),{}) 有区别吗

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

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

我发现在前者的关闭中使用 UIAlertController 显示警报会导致一些不稳定的行为。而且加上后者,再加上0.3秒左右的延迟,效果还不错。

【问题讨论】:

    标签: swift multithreading


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      没有区别。我通过调用它 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.
        }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-11-03
        • 1970-01-01
        • 1970-01-01
        • 2012-04-14
        • 2014-07-31
        • 2018-12-01
        • 1970-01-01
        • 2017-08-04
        • 2013-01-28
        相关资源
        最近更新 更多