Отменить NSOperation в течение цикла? - PullRequest
4 голосов
/ 20 декабря 2010

Я пытаюсь реализовать поиск в фоновом потоке, используя NSOperation на iOS. Я не хотел создавать подкласс NSOperation, поэтому я делаю вот что:

[searchQueue cancelAllOperations];
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self
                                                                  elector:@selector(filterContentForSearchText:)
                                                                   object:self.searchDisplayController.searchBar.text];
[searchQueue addOperation:op];
[op release];

Метод поиска включает цикл for, который проверяет, находится ли искомый объект в массиве. Теперь, когда я отменяю NSOperation, вызывая cancelAllOperations, цикл for продолжает проходить через массив. Я хотел бы предотвратить это, и мне было интересно, допустимо ли вызывать это из цикла for:

if ([[[searchQueue operations] objectAtIndex:0] isCancelled]) {
    [tmp_array release];   // tmp_array is used to hold temporary results
    [pool drain];          // pool is my autorelease pool
    return;
}

1 Ответ

8 голосов
/ 20 декабря 2010

Одна из причин для подкласса NSOperation заключается в реализации правильного отмены.Вы могли бы сделать свой подход, но он нарушает несколько хороших принципов дизайна.По сути, поскольку для отмены требуется взаимодействие самой операции, NSInvocationOperation не создан для отмены вызова, когда он уже выполняется (хотя он может быть успешно отменен до того, как начнет выполняться), как метод выполненияничего не должен знать о том, как он называется.

Вместо этого, если вы подклассом NSOperation, вы можете очень легко поместить большую часть этой функции в метод main:

@implementation MyOperation
- (void)main {
    if ([self isCancelled])
        return;

    for (...) {
        // do stuff

        if ([self isCancelled]) {
            [tmp_array release];
            return;
        }
    }
}

@end

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

...