18

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

機能を 4 つの部分に分割し、シリアルに実行したい

[self ReadAllImagesFromPhotosLibrary];

[self WriteFewImagestoDirectory];

[self GettingBackAllImagesFromFolder]; 

[self MoveToNextView];
4

6 に答える 6

42

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使用すると、次のコードを実行する前にコードが一時停止してブロックの応答を待機するため、実行時間が長い場合に UI がフリーズする可能性があることです。一方asyncでは、コードが実行され、ブロックが非同期的に返されます。

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

于 2014-11-28T09:44:08.300 に答える
5
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 操作がメイン スレッドで実行されることを確認してください。それが役に立てば幸い。

于 2013-07-02T09:10:08.830 に答える
1

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

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

また、この質問を見てください。

于 2013-07-02T09:08:23.607 に答える
1

ブロックで同じことを行うための既存の 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   
}  
于 2013-07-02T10:18:33.437 に答える
0

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

于 2013-12-26T00:31:06.157 に答える