2016-01-14 5 views
4

Привет там,Получить конкретные NSOperation от NSOperationQueue

В моем приложении я создаю NSOperations и добавить их в NSOperationQueue. Иногда, я хочу, чтобы отменить некоторые конкретные операции из моей очереди работы, поэтому я определил свойство идентификатора для моего NSOperation подкласса:

@property (nonatomic, assign) NSString *identifier; 

Но когда я цикл в операцию моей почтовой очереди, и я хочу, чтобы сравнить мою Операцию идентификатор для идентификатора операции я хочу принести, я получил EXC_BAD_ACCESS указывая на если условие:

for (MyCustomNSOperationClass *operation in self.myOperationQueue.operations) 
{ 
    NSString *identifier = [self getRelatedIdentifier]; 
    if ([operation.identifier isEqualToString:identifier]) 
    { 
      [operation cancel]; 
    } 
} 

идентификатор операция должна быть чем-то вроде 33a37fb0-8f77-0132-6c0b-5254005d9147, но когда он выходит из строя, это что-то вроде 0x7be4af00 (когда я использую po operation.identifier). Я говорю, когда он выходит из строя, потому что он не всегда сбой, и когда он не падает, тогда идентификатор правильный (я не уверен, что это супер ясно ...).

Поскольку я новичок в NSOperation, я хотел знать, есть ли другой способ достичь того, что я хотел бы сделать?

Заранее благодарен!

ответ

1

Лучше иметь массив operations:[MyCustomNSOperationClass] (или словарь operations:[String: MyCustomNSOperationClass]), который хранит ссылки на все операции в очереди, а затем вы отменяете его напрямую, не ища его в очереди.

+0

Я просто попробовал это, но у меня все еще есть одна и та же проблема. – Randy

+0

Хорошо, наконец, это работает, когда я использую словарь. Спасибо, Исмаил! – Randy

1

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

NSArray<MyCustomNSOperationClass *> *operations = operationQueue.operations.copy; 

    for (MyCustomNSOperationClass *operation in operations) { 

    if (!operation.isFinished && [operation.identifier isEqualToString:self.cancelIdentifier]) { 
     [operation cancel]; 
    } 

    } 

Вы не должны полагаться на состояние OperationQueue выполнять свои действия и хранить его в словаре, как Исмаил предложил бы быть жизнеспособным решением.

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