NSOperation管理一系列功能

时间:2015-07-27 02:31:29

标签: ios multithreading swift

我有多个应该按顺序发生的功能。 function1function3在后​​台线程中运行。它们的功能是findObjectsInBackgroundWithBlockFunction 2可以在主线程或反向线程上发生,但它应该在function 1之后运行,而function 3应该在function2之后发生。我了解了NSOperationNSOperationQueue,但我不确定如何真正使用它。根据我研究的内容,我只能将类创建为子类NSOperation。它是否正确?我想让每个函数都在NSOpeation之下。以下是我认为正确的方式。这是正确的方法吗?把function1()放在NSOperation里面是否正确?最后,当某些函数发生在NSOperationQueue等后台线程中时,它会影响function 1 & 3吗?谢谢

var operationQueue = NSOperationQueue()
let operation1 : NSOperation = NSOperation(function1())
let operation2 : NSOperation = NSOperation(function2())
let operation3 : NSOperation = NSOperation(function3())

operation2.addDependency(operation1)
operation3.addDependency(operation2)

operationQueue.addOperation(operation1)
operationQueue.addOperation(operation2)
operationQueue.addOperation(operation3)        

func function1 () {
//do something and save data in this class's property
}

func function2 () {
//get data from class's property(data from function1) and do something
//save the result in class's property
}

func function3 () {
  //get data from class's property(data from function2) and do something
 //save the result in class's property
}

2 个答案:

答案 0 :(得分:1)

您可以使用NSBlockOperation来包装块,如下所示:

    let operationQueue = NSOperationQueue()

    let operation1 = NSBlockOperation {
        // body of function 1
    }

    let operation2 = NSBlockOperation {
        // or call function 2
    }

    operation2.addDependency(operation1)

    operationQueue.addOperation(operation1)
    operationQueue.addOperation(operation2)

此外,您可以直接在队列中排队:

    operationQueue.addOperationWithBlock {
        // body of function 3
    }

缺点是您无法访问该操作,因此无法设置依赖项。

答案 1 :(得分:1)

为了让依赖项在您的函数本身执行异步操作时正常工作,您必须:

  • 子类NSOperation;

  • 确保asynchronous属性返回true;以及

  • 执行必要的isExecutingisFinished KVO。

此外,在实现异步操作时,您还应该:

  • 实现取消逻辑,它不仅仅将操作标记为完成,还会停止可能正在进行的任何请求。

有关NSURLSession的并发/异步操作的示例,请参阅https://stackoverflow.com/a/27022598/1271826。这里概述的原则也适用于此。