我只是在玩 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 的新手,所以我做得对吗?