2012-02-15 3 views
2

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

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

return retValue; 

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

ответ

0

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

3

Нет встроенного способ отмены блоков 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

Это на 100% верно, хотя если block() является долговременной операцией, тогда проверка заранее, вероятно, не даст вам результатов, которые вы ищете. Ответ заключается в том, чтобы разбить блок() на более мелкие операции, каждый из которых может быть независимо отменен или поместить проверки для «checkIfCancelled» в сам блок, чтобы он мог периодически следить за тем, чтобы все еще было нормально работать или, если нет, отключить операцию прогресс и возвращение. – jkh

Смежные вопросы