【发布时间】:2013-04-04 08:32:42
【问题描述】:
也就是说,如果我们多次排队同一件事,将不会有并发。 我们先排队的那个会先被执行。
我的意思是只有一个主线程对吧?
【问题讨论】:
标签: ios objective-c xcode4.5 nsoperationqueue
也就是说,如果我们多次排队同一件事,将不会有并发。 我们先排队的那个会先被执行。
我的意思是只有一个主线程对吧?
【问题讨论】:
标签: ios objective-c xcode4.5 nsoperationqueue
我在这里找到了一个不错的答案:
NSOperationQueue and concurrent vs non-concurrent
因此,您可以随时设置所有添加的操作串行:
[[NSOperationQueue mainQueue] setMaxConcurrentOperationCount:1];
【讨论】:
答案是……是和否
当你创建一个新的 NSOperation 添加到你的队列时,你可以使用
- (void)setQueuePriority:(NSOperationQueuePriority)priority
根据文档,队列将使用这个优先级,以及其他因素作为相互依赖来决定接下来将执行什么操作。
只要您的操作具有相同的优先级并且没有操作间依赖关系,它们就应该按照您添加它们的顺序执行,也许还有其他与系统相关的操作,插入它们之间。
【讨论】:
NSOperationQueue类控制一组NSOperation对象的执行。被添加到队列后,操作将保留在该队列中,直到它被显式取消或完成执行其任务。 队列中的操作(但尚未执行)本身根据优先级和互操作对象依赖性进行组织,并相应地执行。一个应用程序可以创建多个操作队列并向其中的任何一个提交操作。操作间的依赖关系为操作提供了绝对的执行顺序,即使这些操作位于不同的操作队列中。在其所有相关操作都完成执行之前,操作对象不会被认为已准备好执行。 对于准备执行的操作,操作队列总是执行相对于其他准备好的操作具有最高优先级的操作。有关如何设置优先级和依赖关系的详细信息,请参阅NSOperation Class Reference。
虽然您通常通过将操作添加到操作队列来执行操作,但这并不是必需的。也可以通过调用其 start 方法手动执行操作对象,但这样做并不能保证该操作与您的其余代码同时运行。
NSOperation类的isConcurrent方法告诉您操作相对于调用其 start 方法的线程是同步运行还是异步运行。 该方法默认返回NO,表示操作在调用线程中同步运行。当您向操作队列提交非并发操作时,队列本身会创建一个线程来运行您的操作。因此,向操作队列添加非并发操作仍会导致操作对象代码的异步执行。
所以,如果我理解正确,这里将没有并发。
【讨论】: