NSOperationQueue和并发与非并发

Ale*_*ove 16 iphone cocoa multithreading cocoa-touch objective-c

我想使用NSOperationQueue设置一个序列化的任务队列,但我对文档中讨论的术语有点困惑.

在NSOperation对象的上下文中,术语并发和非并发不一定是指线程的并行执行.相反,非并发操作是使用为其提供的环境执行的操作,而并发操作负责设置其自己的执行环境.

设置"自己的执行环境"意味着什么?

我的NSOperation派生任务需要按照它们添加到队列的顺序执行.

所以我认为这意味着"非并发"操作,因此我为需要完成的工作实现'main',并为'isConcurrent'返回NO.此外,NSOperationQueue的'setMaxConcurrentOperationCount'将设置为1.

我没有在这些任务之间设置NSOperation依赖性的原因是因为它们插入队列的顺序是它们应该完成的顺序.

这些假设是否正确?

Dar*_*ren 25

NSOperationQueue 始终同时执行操作,同时考虑依赖关系.

"非并发"操作需要单独的线程才能同时执行. NSOperationQueue负责提供这个帖子.换句话说,非并发操作依赖于NSOperationQueue使其成为并发操作.

"并发"操作本身是并发的; 它不需要NSOperationQueue为它创建一个线程.一个例子是使用异步文件IO的操作.

如果您希望串行执行两个或更多操作,则需要使用依赖项.

如果你想要一个操作阻止主线程,那么不要使用NSOperationQueue; 只需在主线程上一个接一个地运行每个操作.

要手动设置最大并发操作,请在operationQueue上使用方法 setMaxConcurrentOperationCount:

  • 该文件规定,仅将最大计数设置为1并不能保证FIFO顺序.NSOperationQueue还考虑了优先级以及确定订单的其他一些事项. (10认同)
  • 如果将NSOperationQueue上的setMaxConcurrentOperationCount设置为1,则不一定需要使用依赖项.根据我的经验,它按照它们添加到队列的顺序处理操作.但是,您可以设置依赖项以确保安全. (9认同)