データがたくさんあるので、FIFO方式のようにGCDキュー順にデータをアップロードしたい。どうやってするか ?
1 に答える
「アップロード」ブロックが何であれ、GCDシリアルキューを作成してから、そのキューにあるすべてのアップロードブロックをdispatch_asyncする必要があります。
キューを作成するには:
dispatch_queue_t myFifoQueue = dispatch_queue_create("com.example.myfifoqueue",DISPATCH_QUEUE_SERIAL);
キューを作成したら、アップロードブロックをディスパッチできます。これらのブロックの1つをキューにディスパッチするには、次のようにします。
dispatch_async(myFifoQueue,myUploadBlock);
「dispatch_async」は、ブロックがシリアルキューに追加されることを保証しますが、現在のスレッド(通常はメインスレッド)はブロックが完了するのを待ちません。シリアルキューを使用すると、すべてのブロックがFIFO順に実行されることが保証されます。
たとえば、があり、NSArray *myArray
呼び出されたメソッドを使用して配列オブジェクトをキューで処理する場合-(void)processObject:(id)object
は、次のようにコードを記述できます。
for(id object in myArray) {
dispatch_async(myFifoQueue,^{
[self processObject:object];
}
);
}
基本的に、ここで行うことは、配列内のすべてのオブジェクトを列挙してから、「processObject:」メソッドを呼び出す単純なブロックをシリアルキューに送信することです。processObjectがタスクを完了するのにかかる時間に関係なく、dispatch_asyncはすぐに戻り、シリアルキューはそのブロックをバックグラウンドスレッドでシリアルに処理します。ここでは、すべてのブロックがいつ完了したかを知る方法がないことに注意してください。したがって、キューの最後に、メインスレッドにキューの終わりを通知するブロックを送信することをお勧めします(これにより、 UIを更新します):
dispatch_async(myFifoQueue,^{
dispatch_async(dispatch_get_main_queue(),
^{
[self endOfUpload];
});
});