如何通过NSOperation来实现并发任务?
我是NSoperation
。 NSoperation
是一个单选对象。
-
我们怎样才能通过
NSoperation
操作同时实现多个操作? -
是否有可能没有
NSoperationQueue
? -
即使我们使用NSoperationQueue,它也会执行操作FIFO格式。它将如何同时执行?
如果你想要实现一个并发操作 – 即相对于调用线程asynchronous运行的操作 – 你必须编写额外的代码来asynchronous启动操作。 例如,您可能会产生一个单独的线程,调用一个asynchronous系统函数或者执行其他任何操作来确保start方法启动任务并立即返回,并且很可能在任务完成之前返回。
大多数开发人员不应该需要实现并发操作对象。 如果您始终将操作添加到操作队列中,则不需要执行并发操作。 当您向操作队列提交非并发操作时,队列本身会创build一个线程来运行您的操作 。 因此,向操作队列中添加非并发操作仍会导致操作对象代码的asynchronous执行。 只有在需要asynchronous执行操作而不将其添加到操作队列的情况下,才能定义并发操作。
请参阅“ 并发编程指南” – “并行与非并行操作”一节
另请阅读使用NSOperationpipe理并发
您通常通过将操作添加到操作队列 (NSOperationQueue类的一个实例)来执行操作。
NSOperationQueue类调节一组NSOperation对象的执行。 在被添加到队列之后,操作将保留在该队列中,直到被明确取消或完成其任务。 队列中的操作(但尚未执行)本身按照优先级和操作间对象依赖关系进行组织,并相应执行 。 应用程序可能会创build多个操作队列并将操作提交给其中的任何一个。
操作队列直接执行操作,通过在辅助线程上运行它们或间接使用libdispatch库来执行操作
你可以在这里阅读更多关于NSOperation的内容, 并在这里阅读更多关于NSOperationQueue的内容
- 哪些任务比GCD更适合NSOperation?
- performSelector:withObject:afterDelay:和dispatch_after之间的折衷是什么?
- 最后先进出栈与GCD?
- 获取当前的调度队列?
- 如何从iOS的Grand Central Dispatch Queueasynchronous绘制到GLKit的OpenGL ES上下文
- 使用Grand Central Dispatch,如何检查是否有块正在运行?
- 无形的执行顺序(dispatch_semaphore_t,dispatch_group_async)及其与不同调度队列types组合使用
- 任何方式使dispatch_queue_t单线程工作?
- dispatch_sync总是在主线程上调度一个块