首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSOperationQueue addOperations waitUntilFinished

NSOperationQueue addOperations waitUntilFinished
EN

Stack Overflow用户
提问于 2015-05-01 18:24:49
回答 1查看 5.7K关注 0票数 4

嗨,我正在用Swift构建一个应用程序。我需要按特定的顺序处理通知。因此,我尝试使用addOperations waitUntilFinished。

以下是我所做的:

代码语言:javascript
复制
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)

使用此代码,不执行任何操作。当我尝试这样做的时候:

代码语言:javascript
复制
NSOperationQueue.mainQueue().maxConcurrentOperationCount = 1
NSOperationQueue.mainQueue().addOperation(oldify)
NSOperationQueue.mainQueue().addOperation(appendify)
NSOperationQueue.mainQueue().addOperation(nettoyify)

操作被执行,但顺序不对。

有人知道我做错了什么吗?我对快速而全新的NSOperations充满信心

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-01 18:56:05

以下几个问题:

  1. 您正在检查完成块处理程序的行为。正如completionBlock文档所述: 未保证完成块的确切执行上下文,但通常是次要线程。因此,您不应该使用这个块来执行任何需要非常特定的执行上下文的工作。

队列将管理操作本身,但不管理它们的完成块(除非确保操作在其completionBlock启动之前完成)。因此,底线是,不要假设(a)在运行完成块时,(b)一个操作的completionBlock与其他操作或它们的completionBlock块之间的关系等等,也不要(c)在哪个线程上执行它们。

  1. 操作通常按照添加到队列的顺序执行。但是,如果您添加了一个操作数组,文档就不会正式保证它们是按照它们在数组中出现的顺序排队的。因此,您可能希望每次只添加一个操作。
  2. 话虽如此,这些文件还是警告我们: 操作队列根据其优先级和准备状态执行其排队的操作对象。如果所有排队操作对象都具有相同的优先级,并准备好在将它们放入队列时执行--也就是说,它们的isReady方法返回YES-they是按照提交到队列的顺序执行的。但是,您不应该依赖队列语义来确保操作对象的特定执行顺序。操作准备状态的更改可以更改结果的执行顺序。如果需要按特定顺序执行操作,请使用NSOperation类定义的操作级依赖项。

要建立显式依赖关系,可以执行如下操作:

让oldify = NSBlockOperation() { NSLog("oldify") } oldify.completionBlock ={ NSLog("oldify完成“)}让NSBlockOperation=NSBlockOperation( NSLog(" appendify ") } appendify.completionBlock ={ NSLog("appendify完成”)} appendify.addDependency(oldify)让nettoyify =NSBlockOperation( NSLog("nettoyify") } nettoyify.completionBlock ={ NSLog("nettoyify完成“)} nettoyify.addDependency(appendify) nettoyify.addDependency= NSOperationQueue() queue.addOperations=NSOperationQueue(附录,网络化,waitUntilFinished: false)

  1. 顺便说一句,如上面所示,您不应该将操作与waitUntilFinished一起添加到主队列中。可以随意地将它们添加到不同的队列中,但不要使用waitUntilFinished选项从串行队列发送回它自己。
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29992735

复制
相关文章

相似问题

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