0

ディスパッチ グループのキューの実行が完了した後で、メソッドを呼び出しています。ただし、すべてのキューが実行された後でも、最終メソッドの実行には大幅な遅延があります。誰でも考えられる理由を説明できますか?

dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_group_async(group, queue,^{
     //some code             
}


dispatch_group_notify(group, queue,
    ^{
        [self allTasksDone];
    });

つまり、非同期キュー内の操作が完了しても、allTask​​sDone メソッドは少し遅れて実行されるということです。

4

2 に答える 2

2

どのように機能し-allTasksDoneますか?ユーザー インターフェイス要素を更新することによってユーザーと通信している場合は、メイン スレッドのコンテキストで実行する必要があります。そうしないと、問題の UI 要素が「遅延」しているように見えます。メインの実行まで更新されません。ループはたまたまそれらを更新します。

代わりにこれを試してください:

dispatch_group_notify(group, dispatch_get_main_queue(),
^{
    [self allTasksDone];
});

そのままでは、デフォルトのバックグラウンド キューで実行-allTasksDoneしているため、AppKit や UIKit とうまく連携しません。

于 2013-04-08T16:41:20.453 に答える
0

別のアプローチをお勧めしますが、ディスパッチ グループを使用してこれを確実に達成できます。

// Important note: This does not work with global queues, but you can use target queues to direct your custom queue to one of your global queues if you need priorities.
dispatch_queue_t queue = dispatch_queue_create("com.mycompany.myqueue", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue,^{
     //some code             
}

dispatch_barrier_async(queue,
    ^{
        // this executes when all previously dispatched blocks have finished.
        [self allTasksDone];
    });
于 2013-04-09T07:03:46.290 に答える