Swift NSBlockOperation未执行
由于我目前正在处理web服务调用和数据库检索,我偶然发现了NSBlockOperation未启动的问题 但是,先解释一下。主要目标是创建一个包含以下操作的操作队列:Swift NSBlockOperation未执行,swift,asynchronous,nsoperation,Swift,Asynchronous,Nsoperation,由于我目前正在处理web服务调用和数据库检索,我偶然发现了NSBlockOperation未启动的问题 但是,先解释一下。主要目标是创建一个包含以下操作的操作队列: 操作#1-向web服务发送请求以开始创建database.zip文件 操作#2-完成#1后,重复调用web服务以了解.zip文件压缩过程的进度 操作#3-完成#2后,使用NSURLSessionDownloadTask下载数据库 为此,我定义了以下类: class DatabaseServerDownload { typealias
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服务请求
而阻塞操作如下所示:
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类。在此之前,我当然浏览了Apple的整个文档和其他一些参考资料,但不幸的是,找不到任何东西。您可以通过NSBlockOperation解决这个问题,NSBlockOperation是通过添加依赖项来序列化操作队列的最佳方法 @dsafa我在gist中为您创建了一个示例: