从 NSOperationQueue 获取特定的 NSOperation

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

提前致谢!

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

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

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

  for (MyCustomNSOperationClass *operation in operations) {

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

  }

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