嗨,我正在使用 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/

    10-09 02:22