2017-07-07 8 views
0

DispatchQueue.main.asyncとDispatch.main.asyncAfter(.now()、{})には違いがありますか?DispatchQueue.main.asyncとDispatch.main.asyncAfter(.now()、{})の相違点

私の質問は遅延時間として.now()と具体的には約asyncAfterです。

2番目の質問は、両方の方法で次のrunloopでクロージャを実行する前に現在のUIスレッドを終了させることができるかどうかです。

前者を閉じてUIAlertControllerを使用してアラートを表示すると、不安定な動作が発生することがあります。そして、後者では、約0.3秒の遅れとともに、うまく機能します。

答えて

0

asyncAfter.nowを使用すると違いはありません。ここに証拠があります。どちらの機能は違いはありません

enter image description here

+0

はどうもありがとうございました。 –

0

呼ば取得後すぐに実行を開始する必要があります。私はそれを100回呼び出すことによってテストし、コールバックはエンキューされたのと同じ順序で実行されます。

さらに、100個のキューを持つことでテストを行い、並列性がどのように動作するかを確認し、コールバックはキューに入れられたときと同じ順序で実行されます。だから、結論はasyncAfter(.nowは())非同期と同じであることである:

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. 
    } 
} 
関連する問題