嗨,我正在使用 Swift 构建一个应用程序。我需要按特定顺序处理通知。因此我试图使用 addOperations waitUntilFinished。
这是我所做的:
let oldify = NSOperation()
oldify.completionBlock = {
println("oldify")
}
let appendify = NSOperation()
appendify.completionBlock = {
println("appendify")
}
let nettoyify = NSOperation()
nettoyify.completionBlock = {
println("nettoyify")
}
NSOperationQueue.mainQueue().maxConcurrentOperationCount = 1
NSOperationQueue.mainQueue().addOperations([oldify, appendify, nettoyify], waitUntilFinished: true)
使用此代码,不会执行任何操作。当我尝试这样做时:
NSOperationQueue.mainQueue().maxConcurrentOperationCount = 1
NSOperationQueue.mainQueue().addOperation(oldify)
NSOperationQueue.mainQueue().addOperation(appendify)
NSOperationQueue.mainQueue().addOperation(nettoyify)
操作得到执行,但顺序不正确。
有谁知道我做错了什么?我对 swift 充满信心,但对 NSOperations 完全陌生
最佳答案
几个问题:
completionBlock
文档所说:队列将自己管理操作,而不是它们的完成块(无法确保操作在其
completionBlock
启动之前完成)。因此,最重要的是,不要对 (a) 何时运行完成块,(b) 一个操作的 completionBlock
与其他操作或其 completionBlock
块等的关系,以及 (c) 它们在哪个线程上执行做任何假设. 要建立显式依赖项,您可以执行以下操作:
let oldify = NSBlockOperation() {
NSLog("oldify")
}
oldify.completionBlock = {
NSLog("oldify completion")
}
let appendify = NSBlockOperation() {
NSLog("appendify")
}
appendify.completionBlock = {
NSLog("appendify completion")
}
appendify.addDependency(oldify)
let nettoyify = NSBlockOperation() {
NSLog("nettoyify")
}
nettoyify.completionBlock = {
NSLog("nettoyify completion")
}
nettoyify.addDependency(appendify)
let queue = NSOperationQueue()
queue.addOperations([oldify, appendify, nettoyify], waitUntilFinished: false)
waitUntilFinished
一起添加到主队列。随意将它们添加到不同的队列,但不要使用 waitUntilFinished
选项从串行队列分派(dispatch)返回自身。 关于ios - NSOperationQueue addOperations waitUntilFinished,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29992735/