从NSOperationQueue获取具体的NSOperation

时间:2016-01-14 14:57:47

标签: ios nsoperation nsoperationqueue

你好,

在我的应用中,我创建NSOperations并将其添加到NSOperationQueue。 有时,我想从我的操作队列中取消一些特定的操作,这就是为什么我为我的NSOperation子类定义了一个标识符属性:

@property (nonatomic, assign) NSString *identifier;

但是当我循环进入队列的操作并且我想将我的操作标识符与我想要获取的操作的标识符进行比较时,我得到一个EXC_BAD_ACCESS指出if条件:

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的新手,我想知道是否还有其他方法可以实现我想做的事情?

提前致谢!

2 个答案:

答案 0 :(得分:1)

最好有一个数组operations:[MyCustomNSOperationClass](或字典operations:[String: MyCustomNSOperationClass])来保持对队列中所有操作的引用,然后直接取消它而不在队列中搜索它。

答案 1 :(得分:1)

您的问题是您没有获取操作的副本,并且可能会在循环时修改队列。

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

  for (MyCustomNSOperationClass *operation in operations) {

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

  }

您不应该依赖OperationQueue的状态来执行您的操作并将其存储在字典中,因为Ismail建议这将是一个可行的解决方案。