NSOperation operationDidFinish有错误,再次向队列添加操作

时间:2016-04-08 08:11:08

标签: ios objective-c xcode swift nsoperation

我正在对GroupOperation进行子类化,如果失败且尝试次数小于5,我想再次运行它。我还有一个delayOperation将它延迟3秒。然而,我无法使用它,这是我到目前为止所做的:

self.conversation是一个对象。

produceConversationOperation()返回backgroundOperation

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()  
            })  
        }  
    }  
}  

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

由于

1 个答案:

答案 0 :(得分:2)

要回答这个问题有点迟了,但您可能希望使用http://github.com/danthorpe/Operations中的RetryOperation来查看,其中包含许多问题:

  1. 最大重试次数
  2. 可自定义的延迟(如果您需要随机/指数等等,则采用等待策略)
  3. 它接受GeneratorType操作
  4. 它接受一个“重试处理程序”尾随闭包,它允许消费者“调整”将要重试的下一个操作实例。
  5. 为了更具体地回答这个问题,并且不确定produceOperation()正在做什么,我会冒险猜测它实际上并没有创建一个新的实例,但在某种程度上是返回原来的操作。