web-dev-qa-db-ja.com

FIFOブロックを使用する)のような単純なGCDシリアルキューの例

シリアルキューを使用してタスクが予測可能な順序で実行されるようにする方法に関するAppleのドキュメントを読みましたが、今は混乱しすぎています。
シリアルで作業する方法がいくつかありますが、それでも明確ではないため、メソッドをシリアルで実行するには、簡単なシリアルの例が必要です。

機能を4つの部分に分割し、それらをシリアルに実行するようにしました

[self ReadAllImagesFromPhotosLibrary];

[self WriteFewImagestoDirectory];

[self GettingBackAllImagesFromFolder]; 

[self MoveToNextView];
18
DreamWatcher

フォローアップしてiCoderの答えを改善するには、次のことを行うことができます。

dispatch_queue_t serialQueue = dispatch_queue_create("com.unique.name.queue", DISPATCH_QUEUE_SERIAL);

dispatch_async(serialQueue, ^{
        [self ReadAllImagesFromPhotosLibrary];
    }); 
dispatch_async(serialQueue, ^{
         [self WriteFewImagestoDirectory];
});
dispatch_async(serialQueue, ^{
    [self GettingBackAllImagesFromFolder]; 
});
dispatch_async(serialQueue, ^{
    [self MoveToNextView];
});

上記の呼び出しはasyncですが、キューに入れられ、シリアルに実行されますDISPATCH_QUEUE_SERIALが示すように。 syncasyncの違いは、syncコードは一時停止し、次のコードを実行する前にブロックの回答を待機します。したがって、実行時間が長い。 asyncの場合、コードが実行され、ブロックが非同期に返されます

ただし、DISPATCH_QUEUE_SERIALに保存したタスクは、GCD(Grand Central)のおかげで、追加された順序で待機して次々に実行されます。ディスパッチ)。

42
Benjamin
dispatch_queue_t serialQueue = dispatch_queue_create("com.unique.name.queue", DISPATCH_QUEUE_SERIAL);

dispatch_async(serialQueue, ^{
        [self ReadAllImagesFromPhotosLibrary];
             dispatch_async(serialQueue, ^{
                     [self WriteFewImagestoDirectory];
                     dispatch_async(serialQueue, ^{
                         [self GettingBackAllImagesFromFolder]; 
                         dispatch_async(serialQueue, ^{
                              [self MoveToNextView];
                         });
                   });
              });
    }); 

上記のコードは機能するはずですが、UI操作がメインスレッドで実行されていることを確認してください。それが役に立てば幸い。

5
iCoder

NSOperationQueueを1に設定してmaxConcurrentOperationCountを使用できます(または、NSOperationごとに依存関係を設定して、依存関係が終了する前に開始されないようにすることもできます)。

これが NSOperationQueue クラスリファレンスです。

this の質問もご覧ください。

1
Dmitry Zhukov

ブロックで同じことを行うための既存のAPIがある場合、私はあまり知りません。

ただし、ブロック(必要な操作を表す)を次のブロックを指すように定義して続行することで、同じことができます。また、処理全体を別のキューに入れることもできます。

ブロックをシリアル方式で実行するためのスニペット

BLOCK A(NEXT BLOCK reference){  
->Do the the required Task  
->If(next Block reference)  
--->Then call that block 
->Else  
--->Exit or have a callback on mainthread   
}  
1
ajonnet

gCDを試してみませんか。GCDは操作のシーケンスを保証し、同期および非同期機能も備えています。

0