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
检查一下,它支持其中的许多问题:
- 最大重试次数
- 可自定义的延迟(如果需要,可以使用等待策略random/exponential/etc)
- 它接受一个
GeneratorType
的操作
- 它接受一个 "retry handler" 尾随闭包,它允许消费者 "tweak" 将重试的下一个操作实例。
为了更具体地回答这个问题,并且不确定 produceOperation()
在做什么,我会冒险猜测它实际上并不是在创建一个新的实例,但在某种程度上是返回原来的操作。
我正在对 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
检查一下,它支持其中的许多问题:
- 最大重试次数
- 可自定义的延迟(如果需要,可以使用等待策略random/exponential/etc)
- 它接受一个
GeneratorType
的操作 - 它接受一个 "retry handler" 尾随闭包,它允许消费者 "tweak" 将重试的下一个操作实例。
为了更具体地回答这个问题,并且不确定 produceOperation()
在做什么,我会冒险猜测它实际上并不是在创建一个新的实例,但在某种程度上是返回原来的操作。