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