【发布时间】:2016-08-29 08:02:30
【问题描述】:
你好,我这里有一个奇怪的情况:
概览:
我正在开发一个用户可以启动多个操作的应用程序,所有这些操作都将在后台线程上运行,因此不会阻塞 UI。其中一些操作相互依赖,而另一些则不依赖。 因此,为了确保操作仅在所有必要的依赖操作完成执行后才执行,我使用了 Operation 的依赖属性。我正在使用异步操作。
这是我的实现:
import UIKit
import CoreData
import SwiftyJSON
class VMBaseOperation: NSOperation {
var finishedStatus : Bool = false
var executionStatus : Bool = false
var retryCount : Int = 0
private (set) var requestToQueue : BaseRequest? = nil
var vmOperationCompletionBlock: ((JSON?) -> Void)?
var vmOperationFailureBlock: ((WebResponseError?) -> Void)?
override init() {
super.init()
}
convenience init(withVMRequest request : BaseRequest) {
self.init()
requestToQueue = request
}
override func start() {
if self.cancelled {
self.finished = true
return
}
NSThread.detachNewThreadSelector(#selector(main), toTarget: self, withObject: nil)
self.executionStatus = true
}
override func main() {
if self.cancelled {
return
}
self.hitWebService()
}
func hitWebService(){
let webserviceManager = WebServiceManager()
webserviceManager.getResponseFromRequest(requestToQueue!) { (requset, response, data, error) in
let error = WebResponseError.checkResponse(response, request: requset, error: error)
if error != nil {
if error == WebResponseError.NO_INTERNET {
if self.vmOperationFailureBlock != nil {
self.vmOperationFailureBlock!(error)
}
self.operationFailed()
}
else{
self.retryCount += 1
if self.retryCount == 3 {
if self.vmOperationFailureBlock != nil {
self.vmOperationFailureBlock!(error)
}
self.operationFailed()
}
else{
self.hitWebService()
}
}
}
else{
if data == nil {
self.retryCount += 1
if self.retryCount == 3 {
if self.vmOperationFailureBlock != nil {
self.vmOperationFailureBlock!(nil)
}
self.operationFailed()
}
else{
self.hitWebService()
}
}
else{
let json = JSON(data: data!)
if self.vmOperationCompletionBlock != nil {
self.vmOperationCompletionBlock!(json)
}
self.operationCompleted()
}
}
}
}
override var finished: Bool {
get{
return finishedStatus
}
set{
self.willChangeValueForKey("isFinished")
finishedStatus = newValue
self.didChangeValueForKey("isFinished")
}
}
override var executing: Bool {
get{
return executionStatus
}
set{
self.willChangeValueForKey("isExecuting")
executionStatus = newValue
self.didChangeValueForKey("isExecuting")
}
}
override var asynchronous: Bool{
get{
return true
}
set{
self.willChangeValueForKey("isAsynchronous")
self.asynchronous = true
self.didChangeValueForKey("isAsynchronous")
}
}
func operationCompleted(){
self.executing = false
self.finished = true
}
func operationFailed(){
self.executing = false
self.finished = false
}
}
它的作用:
每个操作都接受一个 Web 请求并尝试从服务器获取数据,如果失败,它会尝试 3 次,然后通过调用 operationFailed 方法最终将其完成状态设置为 false 并停止所有相关操作的执行另一方面,如果成功,它会通过调用operationCompleted 将其完成状态更改为true,从而触发剩余依赖操作的执行。
问题是什么:
依赖就像一种魅力。没有问题。现在我需要在操作队列中的所有操作执行完成后从服务器同步数据,无论它们是否成功完成。
最简单的方法是创建一个操作来同步来自服务器的数据,并将其作为依赖操作添加到添加到 operationQueue 的所有操作中。
但是由于上述操作的性质,即使一个操作全部失败,它也会停止执行所有相关操作(如预期的那样),但是因为我来自服务器操作的同步数据也是一项相关操作,所以它永远不会执行即使一个操作失败:(
我需要什么:
在维护我上面提到的依赖关系的同时,我需要知道当操作队列中的所有操作完成执行时,无论它们是成功还是失败,如何执行一个操作来同步来自服务器的数据。
这是否可能:(请帮帮我。提前谢谢。
【问题讨论】:
标签: ios swift nsoperation nsoperationqueue