Swift 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

由于我目前正在处理web服务调用和数据库检索,我偶然发现了NSBlockOperation未启动的问题

但是,先解释一下。主要目标是创建一个包含以下操作的操作队列:

  • 操作#1-向web服务发送请求以开始创建database.zip文件
  • 操作#2-完成#1后,重复调用web服务以了解.zip文件压缩过程的进度
  • 操作#3-完成#2后,使用NSURLSessionDownloadTask下载数据库
  • 为此,我定义了以下类:

    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中为您创建了一个示例: