GCDスケジューリンググループの使用

2712 ワード

単語表

 1.dispatch  
 2. queue    
 3. sync      
 4. async    
 5. DISPATCH_QUEUE_CONCURRENT  
 6. DISPATCH_QUEUE_SERIAL  

シーンの操作


実際の開発では,N個の非同期スレッドを開く必要があるが,後続の操作では,N個のスレッドが返すデータに依存し,すべてのスレッドタスクの実行完了の通知を受信する必要がある.

一般的な使い方

/**
  - , 
 */
- (void)group1 {

    // 1.  
    dispatch_group_t group = dispatch_group_create();

    // 2.  
    dispatch_queue_t q = dispatch_get_global_queue(0, 0);

    // 3.  
    dispatch_group_async(group, q, ^{
        [NSThread sleepForTimeInterval:1.0]; 
        NSLog(@"  1 %@", [NSThread currentThread]);
    });
    dispatch_group_async(group, q, ^{
        NSLog(@"  2 %@", [NSThread currentThread]);
    });
    dispatch_group_async(group, q, ^{
        NSLog(@"  3 %@", [NSThread currentThread]);
    });

    // 4.  
    dispatch_group_notify(group, q, ^{
        NSLog(@"OVER %@", [NSThread currentThread]);
    });

    // 5.  
    NSLog(@"come here");
}

注意:dispatch_group_notifyこの関数は非同期で、同期に置き換えるにはdispatch_group_wait(group, DISPATCH_TIME_FOREVER).グループは空ではありません.このコードはずっと待っています.次のコードは実行しません.

enter & leavel


dispatch_group_enter(group)関数内部実装原理
端末入力:*man dispatch_group_Enter**連続2つのスペース
void dispatch_group_async(dispatch_group_t group, dispatch_queue_t queue, dispatch_block_t block)
{
    dispatch_retain(group);
    dispatch_group_enter(group);
    dispatch_async(queue, ^{
        block();
        dispatch_group_leave(group);
        dispatch_release(group);
    });
}

dispatch_group_leave(group)関数
  • とdispatch_group_enter(group)ペアで
  • が現れる
  • blockの最後の文
  • でなければなりません

    特殊なシーンでの使用法

    - (void)group2 {
        //  
        dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
        //  
        dispatch_group_t group = dispatch_group_create();
        
        // 1.  ,  group  ,  block   group  
        // dispatch_group_enter   dispatch_group_leave  !
        dispatch_group_enter(group);
        dispatch_async(queue, ^{
            [NSThread sleepForTimeInterval:10];
            NSLog(@"download A - %@", [NSThread currentThread]);
            //  
    
            // 2.  
            dispatch_group_leave(group);
        });
        
        dispatch_group_enter(group);
        dispatch_async(queue, ^{
            [NSThread sleepForTimeInterval:1.0];
            NSLog(@"download B - %@", [NSThread currentThread]);
            //  
    
            // 2.  
            dispatch_group_leave(group);
        });
        
        //  , , , , 
        dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
        NSLog(@"OK");
    }
    

    注意:同様に最後にグループの通知を待つこともできますが、非同期に変更することもできます.通常の書き方の例を参照してください.
  • 補足待ち..