2017-07-07 30 views
0

DispatchQueue.main.async和Dispatch.main.asyncAfter(.now(),{})之間有區別嗎?DispatchQueue.main.async和Dispatch.main.asyncAfter之間的區別(.now(),{})

我的問題具體是關於asyncAfter用.now()作爲延遲時間。

第二個問題是,如果兩個方法都允許當前UI線程在執行下一個runloop中的閉包之前結束?

我發現在前者的關閉中使用UIAlertController顯示警報會導致一些不穩定的行爲。對於後者,加上約0.3秒的延遲,它運作良好。

回答

0

如果您選擇使用asyncAfter.now,則沒有區別。這是證明。這兩個功能應該開始獲取調用

enter image description here

+0

非常感謝。 –

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