我有多个应该按顺序发生的功能。 function1
和function3
在后台线程中运行。它们的功能是findObjectsInBackgroundWithBlock
。 Function 2
可以在主线程或反向线程上发生,但它应该在function 1
之后运行,而function 3
应该在function2
之后发生。我了解了NSOperation
和NSOperationQueue
,但我不确定如何真正使用它。根据我研究的内容,我只能将类创建为子类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
}
答案 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
;以及
执行必要的isExecuting
和isFinished
KVO。
此外,在实现异步操作时,您还应该:
有关NSURLSession
的并发/异步操作的示例,请参阅https://stackoverflow.com/a/27022598/1271826。这里概述的原则也适用于此。