首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSBlockOperation不执行

NSBlockOperation不执行
EN

Stack Overflow用户
提问于 2016-02-07 13:15:03
回答 1查看 439关注 0票数 1

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

不过,一开始要解释一下。主要目标是有一个由以下操作组成的操作队列:

  1. 操作1-向web服务发送请求以开始创建数据库.zip文件
  2. 操作2-在完成#1后,重复调用web服务以了解.zip文件压缩过程的进展情况。
  3. 操作3-在完成#2之后,使用NSURLSessionDownloadTask下载数据库。

为此,我定义了以下类:

代码语言:javascript
复制
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如下所示:

代码语言:javascript
复制
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类。在此之前,我当然翻阅了整个苹果公司的文档和其他一些参考资料,但不幸的是,我找不到任何东西。

EN

回答 1

Stack Overflow用户

发布于 2016-05-19 06:44:58

您可以通过NSBlockOperation来解决这个问题,这是通过添加依赖关系来序列化操作队列的最佳方法,

@dsafa我在gist中为您创建了一个示例:https://gist.github.com/prajwalabove/66eecbf6b6aa096d5e18b04bd0cc18e8

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35253928

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档