私はGCDで遊んでいて、おもちゃのCoinFlipperアプリを作成しました。
コインを裏返す方法は次のとおりです。
- (void)flipCoins:(NSUInteger)nFlips{
// Create the queues for work
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL);
// Split the number of flips into whole chunks of kChunkSize and the remainder.
NSUInteger numberOfWholeChunks = nFlips / kChunkSize;
NSUInteger numberOfRemainingFlips = nFlips - numberOfWholeChunks * kChunkSize;
if (numberOfWholeChunks > 0) {
for (NSUInteger index = 0; index < numberOfWholeChunks; index++) {
dispatch_async(queue, ^{
NSUInteger h = 0;
NSUInteger t = 0;
flipTheCoins(kChunkSize, &h, &t);
dispatch_async(mainQueue, ^{
self.nHeads += h;
self.nTails += t;
});
});
}
}
if (numberOfRemainingFlips > 0) {
dispatch_async(queue, ^{
NSUInteger h = 0;
NSUInteger t = 0;
flipTheCoins(numberOfRemainingFlips, &h, &t);
dispatch_async(mainQueue, ^{
self.nHeads += h;
self.nTails += t;
});
});
}
}
ご覧のように; フリップの数を大きなチャンクに分割して、バックグラウンドでフリップし、メインキューのプロパティを更新しています。プロパティはウィンドウコントローラーによって監視されており、UIは実行結果で更新されます。
同時実行プログラミングガイドとGCDドキュメントを確認しました。キューを一時停止する方法はありますが、それらを停止して、キューに入れられて実行されていないすべてのオブジェクトを削除する方法はありません。
「停止」ボタンを接続して、開始後に反転をキャンセルできるようにしたいと思います。これにより、プロパティをNSOperationQueue
監視して、実行されているかどうかを確認し、キューに入れられたブロックを削除できます。operationCount
cancelAllOperations
同時実行プログラミングガイドとGCDドキュメントを確認しました。キューを一時停止する方法はありますが、それらを停止して、キューに入れられて実行されていないすべてのオブジェクトを削除する方法はありません。
それで :-
- キューに追加したブロックがまだ待機しているかどうかを確認するにはどうすればよいですか?
- まだ実行されていないブロックをキャンセルするにはどうすればよいですか?
- 私はGCDに慣れていないので、正しくやっていますか?