NSOperation operationDidFinish 出现错误,再次将操作添加到队列

NSOperation operationDidFinish with errors, add operation to queue again

我正在对 GroupOperation 进行子类化,如果它失败并且尝试次数少于 5 次,我想再次 运行 它。我还有一个 delayOperation 可以延迟它由 3 秒。但是我无法让它工作,这是我目前所拥有的:

self.conversation 是一个对象。

produceConversationOperation()returns一个后台操作

override func operationDidFinish(operation: NSOperation, withErrors errors: [NSError]) {  
    if let _ = errors.first {  
       if let _ = operation as? BackgroundOperation {  
            context.performBlockAndWait({ () -> Void in  
                self.conversation.retryCountValue++  

                if self.conversation.retryCountValue < 5 {  

                    let postConversationOperation = self.produceConversationOperation()  
                    let delayOperation = DelayOperation(interval: 3)  

                    postConversationOperation.addDependency(delayOperation)  

                    self.produceOperation(delayOperation)  
                    self.produceOperation(postConversationOperation)  
                }  
                else {  
                    self.conversation.retryCountValue = 0  
                }  

                self.saveContext()  
            })  
        }  
    }  
}  

由于某种原因,在第一次失败后,该操作没有再次 运行ning。我感觉问题出在 self.produceOperation 方法上,但我不知道是什么。 类似问题有一些解决方案,但我没有找到任何有用的方法。

谢谢

回答这个问题有点晚了,但您可能想使用 http://github.com/danthorpe/Operations 中的 RetryOperation 检查一下,它支持其中的许多问题:

  1. 最大重试次数
  2. 可自定义的延迟(如果需要,可以使用等待策略random/exponential/etc)
  3. 它接受一个GeneratorType的操作
  4. 它接受一个 "retry handler" 尾随闭包,它允许消费者 "tweak" 将重试的下一个操作实例。

为了更具体地回答这个问题,并且不确定 produceOperation() 在做什么,我会冒险猜测它实际上并不是在创建一个新的实例,但在某种程度上是返回原来的操作。