GCD(一)

2998 ワード

GCD(一)


GCDには3つのキュータイプがあります.
  • The main queue:メインスレッド機能と同様に、実際に運用する場合、main queueにコミットされたタスクはメインスレッドで実行されます.main queueはdispatchを呼び出すことができます.get_main_を参照してください.main queueはプライマリ・スレッドに関連しているため、シリアル・キューであることがわかります.
  • Global queues:グローバルキューは同時キューであり、プロセス全体で共有されます.プロセスには、高、中(default)、低の3つのグローバルキュー優先度があります.
  • ユーザキュー:ユーザキューは関数dispatch_であるqueue_createが作成したキューはシリアルで、オペレーティングシステムの反発に似た同期実行を完了するために使用できます.

  • キューの作成


    ユーザーキューを使用する場合は、関数を呼び出して作成します.
    dispatch_queue_create(, );
    関数の最初のプロパティはラベルで、debugのために使用されます.バックドメイン名でキューの名前を付けるのが望ましいです.2番目のパラメータは役に立たないので、NULLを入力すればいいです.

    ジョブの発行(Job)


    ジョブをキューにコミットするのは簡単です.dispatch_を呼び出すasync関数は、キューとblockを入力します.
    // 
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            [self dosomeThing];
            NSLog(@"dispatch_async in ViewDidLoad");
            
            // job , , 
            dispatch_async(dispatch_get_main_queue(), ^{
               
                // 
                NSLog(@"update UI in main_queue");
            });
        });
    
    dispatch_async ,block 。
    // 
        // block 
        // __block , block  , 
        __block NSString *str ;
        dispatch_sync(dispatch_get_main_queue(), ^{
            str = [_myLabel.text copy];
            
        });
        
        // block , , 
        dispatch_queue_t bgQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
        
        dispatch_async(dispatch_get_main_queue(), ^{
           
            NSString *str = [_myLabel.text copy];
            dispatch_async(bgQueue, ^{
               //use
                
            });
            
        });
    
    , , , block , 。

    ロックは適用されません


    ここではまずdispatch_について説明しますsyncとdispatch_asyncのワークフロー
    dispatch_sync(queue,block)は2つのことをしました
    *  block queue  ;
    *  , block , 。
    
    

    dispatch_async(queue,block)も2つのことをしました
    *  block queue  ;
    *  ( )
    
    

    どうやって同期ロックを実現しますか?実は、私たちのデータが同じシリアル同期キューで実行されるだけでいいです.
    このような機能を実現するためにはDISPATCHが必要です.QUEUE_SERIALキュー、すなわちユーザキュー.
    _syncQueue = dispatch_queue_create("com.kingandyoga.syncQueue", NULL);
    
    //get  
    - (NSString *)someString
    {
        __weak NSString *localSomeString;
        dispatch_sync(_syncQueue, ^{
            localSomeString = _someString;
        });
        return localSomeString;
    }
    
    //set  
    - (void)setSomeString:(NSString *)someString
    {
        dispatch_sync(_syncQueue, ^{
            _someString = someString;
        });
    }
    

    ただし、設定方法は必ずしも同期である必要はなく、インスタンス変数を設定するblockは値を返さないので、この方法を非同期に変更することができます.
    - (void)setSomeString:(NSString *)someString
    {
        dispatch_async(_syncQueue, ^{
            _someString = someString;
        });
    }
    
    

    今回はdispatch_をsyncをdispatch_に変更asyncは,呼び出し者から見て実行速度を向上させた.非同期配布dispatch_が実行されたからこそasyncはblockをコピーし、blockをコピーする時間がblockを実行する時間より大きい場合、dispatch_asyncの速度はdispatchより速くなります.syncの速度はもっと遅い.実際にはblockが実行するタスクの重さに応じてdispatch_の使用を決定する必要があります.asyncかdispatch_かsync.