4

也就是说,如果我们多次将同一件事排队,则不会有并发。我们首先排队的将首先执行。

我的意思是只有一个主线程对吗?

4

3 回答 3

6

我在这里找到了一个很好的答案:

NSOperationQueue 和并发与非并发

因此,您可以随时设置所有添加的操作串行:

[[NSOperationQueue mainQueue] setMaxConcurrentOperationCount:1];

于 2013-04-04T08:39:03.353 回答
2

答案是……是和否

当您创建一个新的 NSOperation 添加到您的队列时,您可以使用

- (void)setQueuePriority:(NSOperationQueuePriority)priority

根据文档,队列将使用此优先级和其他因素作为相互依赖关系来决定接下来将执行什么操作。

只要您的操作具有相同的优先级并且没有相互操作依赖关系,它们就应该按照您添加它们的相同顺序执行,也许还有其他与系统相关的操作,插入它们之间。

于 2013-04-04T08:42:43.193 回答
1

文档

该类NSOperationQueue规范一组NSOperation对象的执行。被添加到队列后,操作将保留在该队列中,直到它被显式取消或完成其任务的执行。队列中的操作(但尚未执行)本身是根据优先级和互操作对象依赖关系组织的,并相应地执行。一个应用程序可以创建多个操作队列并向其中的任何一个提交操作。

操作间的依赖关系为操作提供了绝对的执行顺序,即使这些操作位于不同的操作队列中。直到其所有相关操作都完成执行后,才认为操作对象已准备好执行。对于准备执行的操作,操作队列总是执行相对于其他就绪操作具有最高优先级的操作。有关如何设置优先级和依赖关系的详细信息,请参阅NSOperation 类参考

关于线程

尽管您通常通过将操作添加到操作队列来执行操作,但这并不是必需的。也可以通过调用其 start 方法手动执行操作对象,但这样做并不能保证该操作与您的其余代码同时运行。类的isConcurrent方法NSOperation告诉你一个操作相对于调用它的 start 方法的线程是同步运行还是异步运行。默认情况下,此方法返回 NO,表示操作在调用线程中同步运行

当您将非并发操作提交到操作队列时,队列本身会创建一个线程来运行您的操作。因此,将非并发操作添加到操作队列仍然会导致操作对象代码的异步执行。

所以,如果我理解正确,这里将没有并发。

于 2013-04-04T08:37:05.090 回答