iOS - Как проверить, находится ли NSOperation в NSOperationQueue? - PullRequest
6 голосов
/ 07 марта 2011

Из документов:

Объект операции может находиться не более одной очереди за раз, и этот метод генерирует исключение NSInvalidArgumentException, если операция уже находится в другой очереди. Точно так же этот метод генерирует исключение NSInvalidArgumentException, если операция выполняется в данный момент или уже завершена.

Так, как я могу проверить, могу ли я безопасно добавить NSOperation в очередь?

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

Ответы [ 2 ]

16 голосов
/ 07 марта 2011

NSOperationQueue объекты имеют свойство с именем operations.

Если у вас есть ссылка на ваши очереди, это легко проверить.

Вы можете проверить, содержит ли NSArray операций ваш NSOperation, например:

NSOperationQueue *queue = [[NSOperationQueue alloc] init];

NSOperation *operation = [[NSOperation alloc] init];

[queue addOperation:operation];

if([queue operations] containsObject:operation])
    NSLog(@"Operation is in the queue");
else
    NSLog(@"Operation is not in the queue");

Или вы можете перебрать все объекты:

for(NSOperation *op in [queue operations])
    if (op==operation) {
        NSLog(@"Operation is in the queue");
    }
    else {
        NSLog(@"Operation is not in the queue");
    }

Скажи мне, если это то, что ты ищешь.

В качестве альтернативы, NSOperation объекты имеют несколько свойств, которые позволяют вам проверять их состояние; такие как: isExecuting, isFinished, isCancelled и т. д. *

4 голосов
/ 07 марта 2011

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

Если вы по-прежнему хотите ссылаться на отдельные NSOperation объекты после их добавления в очередь, вы можете сделать это, используя NSOperationQueue - (NSArray *)operations метод.

...