【发布时间】:2009-10-11 13:12:04
【问题描述】:
我只是在玩 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 方面的新手,所以我做得对吗?
【问题讨论】:
标签: objective-c cocoa multithreading grand-central-dispatch