由于我目前正在处理web服务调用和数据库检索,我偶然发现了NSBlockOperation未启动的问题。
不过,一开始要解释一下。主要目标是有一个由以下操作组成的操作队列:
为此,我定义了以下类:
class DatabaseServerDownload {
typealias Callback = (storedLocation : NSURL) -> ()
typealias Failure = ((error : NSError) -> Void)
let callback : Callback
let failure : Failure
let operationQueue : NSOperationQueue
required init(callback : Callback, failure : Failure) {
operationQueue = NSOperationQueue()
operationQueue.maxConcurrentOperationCount = 1
self.callback = callback
self.failure = failure
}
func start() {
let databaseCreationOperation = createDatabaseOnServer()
let databaseCheckOperation = repeatedlyCheckForDatabaseReadiness()
let databaseDownloadOperation = downloadDatabaseFromServer()
databaseCheckOperation.addDependency(databaseCreationOperation)
databaseDownloadOperation.addDependency(databaseCheckOperation)
operationQueue.addOperations([databaseCreationOperation, databaseCheckOperation, databaseDownloadOperation], waitUntilFinished: true)
}
func createDatabaseOnServer() -> BlockOperation {
let operation : BlockOperation = BlockOperation()
operation.addExecutionBlock({SVMRSendTask(method: BeginCreatingDatabase(), onSuccess: {operation.finish()}, onFailure: {e in}).apply()})
return operation
}
func repeatedlyCheckForDatabaseReadiness() -> NSBlockOperation {
return NSBlockOperation(block: {SVMRRequestTask(method: DatabaseZipReady()).apply(5, c: {s in s == "OK"}, f: {s in String(s)}, onSuccess: {r in}, onFailure: {e in})})
}
func downloadDatabaseFromServer() -> NSBlockOperation {
let sourceURL : NSURL = RequestDatabaseIdentitiesForDownload.sharedInstance.databaseURL
return NSBlockOperation(block: {DownloadTask(url: sourceURL, progressCallback: {p in}, successCallback: {l in}, failureCallback: {e in }).start()})
}
}当SVMRRequestTask将web服务方法作为参数(方法是抽象类SVMR的实例)时,它使用NSURLSessionTasks执行web服务请求。
而BlockOperation如下所示:
class BlockOperation : NSBlockOperation {
private var _isFinished : Bool = false
private var _isExecuting : Bool = false
override var finished : Bool {
return _isFinished
}
override var executing : Bool {
return _isExecuting
}
func finish() {
if cancelled {
return
}
self.willChangeValueForKey("ready")
_isReady = false
self.didChangeValueForKey("ready")
self.willChangeValueForKey("executing")
_isExecuting = false
self.didChangeValueForKey("executing")
self.willChangeValueForKey("finished")
_isFinished = true
self.didChangeValueForKey("finished")
}
}有人能解释我到底做错了什么吗?因为我是第一次使用NSOperation类。在此之前,我当然翻阅了整个苹果公司的文档和其他一些参考资料,但不幸的是,我找不到任何东西。
发布于 2016-05-19 06:44:58
您可以通过NSBlockOperation来解决这个问题,这是通过添加依赖关系来序列化操作队列的最佳方法,
@dsafa我在gist中为您创建了一个示例:https://gist.github.com/prajwalabove/66eecbf6b6aa096d5e18b04bd0cc18e8
https://stackoverflow.com/questions/35253928
复制相似问题