Как убить / приостановить / закрыть асинхронный блок в GCD? - PullRequest
2 голосов
/ 15 февраля 2012

Я реализовал блок, который отправляется асинхронно с использованием GCD, следующим образом:

__block BOOL retValue;
dispatch_async(dispatch_get_global_queue(0, 0), ^{
    retValue = [self GCDHandler:actionName WithServiceType:serviceType :arguments];
});

return retValue;

Как отменить такой блок, если он работает дольше, чем хотелось бы?Есть ли способ отменить блоки GCD-отправки или предоставить им тайм-аут?

Ответы [ 2 ]

3 голосов
/ 15 февраля 2012

Не существует встроенного способа отмены блоков GCD.Они скорее настроены и забывают.Один из способов, которым я делал это в прошлом, - это предоставление «токенов» для блоков.

- (NSString*)dispatchCancelable:(dispatch_block_t)block
{
    dispatch_async(dispatch_get_global_queue(0, 0), ^{
        if (!checkIfCanceled)
            block();
    }
    return blah; //Create a UUID or something
}

- (void)cancelBlock:(NSString*)token
{
   //Flag something to mark as canceled
}
0 голосов
/ 15 февраля 2012

Это зависит от того, что делает ваш GCDHandler. На сайте разработчиков Apple есть несколько довольно хороших видео о GCD - вы можете захотеть переместиться вверх по слою (в Какао) и использовать NSOperationQueue и NSOperations (либо ваш собственный подкласс, либо NSBlockOperation). Все они построены на основе GCD, и уровень абстракции может быть более подходящим для того, что вы пытаетесь сделать (чего вы не заявляете - это сетевой запрос? И т. Д.)

...