2012-04-25 3 views
1

Я загрузил информацию с URL-адреса, и я отправляю этот url как NSOperation в NSOperationQueue, я хочу знать, как я могу удалить определенный NSOperation для загрузки данных для определенного URL-адреса, теперь я делая таким образом:Отмена NSOperation От NSOperationQueue

AppDelegate *appController = (AppDelegate *) [[UIApplication sharedApplication] delegate]; 

    for (NSOperation *op in appController.seriesQueue.operations) { 

     if ([op isKindOfClass:[MyDowndload class]]) { 

      MyDownload *urlInDownload = (MyDowndload *)op; 

      if ([urlInDownload.myNew.urlName isEqualToString:[managedObject valueForKey:@"urlName"]] && [urlInDownload.myNew.language isEqualToString:[managedObject valueForKey:@"language"]]) { 
       [op cancel]; 
      } 
     } 
    } 

Я имею информацию в Tableview, поэтому, когда я удалить строку для индекса пути я вхожу в этой проверке, и также ввести в [цит отменить] линию, но я могу видеть в журнале консоли, который поток все еще загружает, как я могу остановить и удалить его?

+0

'url.myNew.language', если условия. Это правильно? или 'urlInDownload.myNew.language'? – Ilanchezhian

+0

Я прав, это только ошибка вставить здесь, но в моем коде я пишу это правильно ... вы знаете, я могу решить проблему? – Piero

ответ

8

Согласно яблочному основному положению, отмена операции не сразу заставить его остановить то, что он делает. Несмотря на то, что для всех операций необходимо учитывать значение, возвращаемое isCancelled, ваш код должен явно проверить значение, возвращаемое этим методом, и прервать его по мере необходимости.

Пример как Justin Предлагается .... Это способ прекратить выполнение метода по мере необходимости.

- (void)main 
{ \\ ...do work... 
    if (self.isCancelled) 
     { \\ ...get out... } 
} 

NSOperation Class Reference by apple

+1

+1 быстрый пример был бы полезен: MONOperation - '- (void) main {\ n ... do work ... \ n if (self.isCancelled) {\ n ... get out ... \ n} \ n ... \ n} \ n'. – justin

+0

спасибо, я положил некоторый self.isCancelled флаг в NSOperation, чтобы проверить некоторое время в загрузке, а теперь работает :) – Piero

+0

есть способ приостановить всю операцию в очереди? – Piero

0

Чтобы прекратить загрузку операции запроса, необходимо убить/остановить runloop этого запроса.

Чтобы найти конкретную операцию в очереди на работу, я думаю, что указанная операция разрешена.

, если вам нужно больше контроля,

создать подкласс NSOperation и использование тега для каждой операции, так что вы можете найти конкретную операцию быстро, проверяя с уникальной меткой.

И положите пользовательский KVO в подкласс операции, чтобы немедленно замораживать операцию, когда это необходимо. Я имею в виду переопределить метод начала этого потока.

спасибо,

Нэвины Shan

+0

Я подклассифицировал nsoperation, класс MyDownload является подклассом NSOperation, и все работает правильно, когда я пытаюсь его отменить, я вхожу в оператор if и выполняю операцию [op cancel]; но не работают ... и имя url является свойством этого подкласса nsoperation, который я использую для тега ... – Piero

+0

Проверка целых чисел быстрее, чем сравнение строк. просто переопределите метод отмены и попытайтесь остановить runloop. –

+0

создание используя этот KVO, [self willChangeValueForKey: @ «isCancelled»]; _isCancelled = YES; [self didChangeValueForKey: @ "isCancelled"]; –

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