Я просто играю с 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;
});
});
}
}
Как вы можете видеть; Я разбиваю количество переворотов на большие куски, переворачивая их в фоновом режиме и обновляя свойства в основной очереди. Свойства наблюдаются оконным контроллером, и пользовательский интерфейс обновляется с результатами выполнения.
Я просмотрел руководство по программированию Concurrency и документы GCD, и хотя есть способ приостановить очередь, нет способа остановить их и удалить все запущенные и не запущенные объекты.
Я хотел бы иметь возможность подключить кнопку "Стоп", чтобы отменить перелистывание после его начала. С помощью NSOperationQueue
я могу узнать свойство operationCount
, чтобы узнать, запущен ли он, и cancelAllOperations
для удаления блоков в очереди.
Я просмотрел руководство по программированию Concurrency и документы GCD, и хотя есть способ приостановить очередь, нет способа остановить их и удалить все запущенные и не запущенные объекты.
Итак: -
- Как узнать, все еще ждут ли блоки, добавленные в очередь?
- Как отменить блоки, которые еще не запущены?
- Я новичок в материалах GCD, так что я делаю это правильно?