NSOperationQueue 的简单介绍

2018-06-06  本文已影响26人  哆啦_

NSOperationQueue 是调节操作执行的队列。

操作队列根据NSOperation对象的优先级和准备情况执行排队的NSOperation对象。operation添加到一个队列中之后,operation将保持在队列中,直到它完成任务。添加后,不能直接从队列中删除operation。

注意:

操作队列会retain 操作,直到它们完成。并且操作队列自身也会被retain,直到所有的操作完成。使用未完成的operation挂起 操作队列会导致内存泄漏

操作队列的更多信息可以查看官方文档

确定执行顺序

队列中的操作根据其准备情况,优先级和操作依赖性进行执行。 如果所有排队的操作都具有相同的 queuePriority, 并且 ready 属性返回 YES ,则会按照添加到队列的顺序执行。 否则,操作队列总是执行相对于其他操作具有最高优先级的操作。

我们不应该依赖队列来确保操作的特定执行顺序,因为操作准备情况的更改可能会改变执行顺序。 操作依赖为操作提供了一个绝对的执行顺序,即使这些操作位于不同的操作队列。 操作对象直到它依赖的所有的操作完成执行之前都不会被视为可以执行。

取消操作

结束任务并不一定意味着operation完成该任务,操作也可以被取消。取消一个operation对象会将其留在队列中,但是会通知对象尽可能快的 stop 其任务。对于正在执行的操作,这意味着operation对象的工作代码必须检查取消状态、停止正在做的事情,并标记自身为finished。 对于正在排队但尚未执行的操作,队列必须调用operation对象的start方法,以便于他可以处理取消事件并将自身标记为finished.

注意:

取消一个操作会导致操作忽略它可能具有的依赖关系。可能会使队列尽可能快地执行operation的start方法。 start 方法反过来将操作转至 finished 状态,以便它可以从队列中移除。

KVO-兼容属性

NSOperationQueue 类是支持KVC和KVO的。我们可以根据需要观察以下属性:

  • @property(readonly, copy) NSArray<__kindof NSOperation *> *operations;

  • @property(readonly) NSUInteger operationCount;

  • @property NSInteger maxConcurrentOperationCount;

  • @property(getter=isSuspended) BOOL suspended;

  • @property(copy) NSString *name;

线程安全

使用单个 NSOperationQueue 对象是多线程安全的,不需要使用额外的锁来同步对该对象的访问

操作队列使用 Dispatch 框架来启动操作的执行。因此,操作总是在一个单独的线程上执行,而不管它们是被指定为同步还是异步。

主要方法

访问特定操作队列
管理队列中的操作
管理操作的执行
暂停执行
队列的配置
资料来源:
上一篇 下一篇

猜你喜欢

热点阅读