NSOperationQueue

一个控制操作执行的队列
继承自NSObject

概述

操作队列根据操作的优先级和准备状态执行其排列的NSOperation对象。将操作添加到操作队列中后,操作会一直保留在队列中,直到报告期完成任务为止。在添加操作后,不能直接从对垒中删除该操作。

注意:

操作一直保留在队列中直到完成任务,而队列本身会一直被保留,直到所有的操作都完成。挂起一个没有完成操作的操作队列会导致内存泄漏。

确定执行顺序

队列中的操作根据它们的就绪程度、优先级、操作间的依赖关系来进行组织安排,和相应的执行。如果排队的操作都有相同的队列优先级,并且都准备就绪可以执行,也就是说它们的ready属性都是YES,那么它们就会被按照提交到队列中的顺序执行。否则,操作队列会执行准备就绪的操作中优先级最高的那个操作。
然而,但是我们永远不能依赖队列语义来确保操作的特定执行顺序。因为操作的准备状态的改变是会改变结果的执行顺序的。操作间的依赖关系为操作提供了绝对的执行顺序,即使这些操作位于不同的操作队列中。在操作对象依赖的操作都完成执行之前,操作对象是不会认定已经准备就绪可以执行的。

取消操作

完成了任务并不一定意味着执行该任务的操作完成了;一个操作也可能会被取消。取消操作对象会将这个对象留在队列中,但是会通知这个对象,它应该尽快停止其任务。对于当前正在执行的操作,这意味着操作对象的工作代码必须检查取消状态,停止正在执行的操作,并将自己标记为完成状态。对于正在排队但是还没有执行的操作,队列仍然必须调用操作对象的start方法,以便它可以处理取消事件并标记自己为完成状态。

注意:

取消操作会导致操作忽略其依赖项。这个行为可能会使队列尽快执行操作的start方法。然后,start方法会将操作移到完成状态,以便从队列中删除该操作。

符合KVO的属性

NSOperationQueue类符合KVC和KVO。我们可以观察这些属性来控制应用的其他部分。为了观察这些属性,使用以下键路径:

    •   operations - 只读  
    •   operationCount - 只读  
    •   maxConcurrentOperationCount - 可读可写  
    •   suspended - 可读可写  
    •   name - 可读可写  

尽管我们可以给属性添加观察者,我们也不应该使用Cocoa绑定来把它们和UI控件绑定在一起。因为通常和UI相关的代码必须在主线程中执行。但是,和操作队列相关的KVO通知可能出现在任意一个线程中。

线程安全

从多个线程使用单个NSOperationQueue对象而不创建额外的锁来同步对该对象的访问是安全的。
操作队列使用派发框架来启动操作的执行。因此,不管操作是同步的还是异步的,总是在单独的线程上执行的。

访问特定的操作队列

mainQueue
返回主线程相关的操作队列
currentQueue
返回启动当前操作的操作队列

管理队列中的操作

- addOperation:
给接收器添加特定的操作.
- addOperations:waitUntilFinished:
添加特定的操作到队列.
- addOperationWithBlock:
在操作中封装特定的块并添加给接收器
operations
队列中当前的操作
operationCount
队列中当前的操作数
- cancelAllOperations
取消所有排队的和正在执行的操作
- waitUntilAllOperationsAreFinished
阻塞当前线程直到接收者中所有排队的和正在执行的操作都完成执行

管理操作的执行

qualityOfService
应用在使用队列执行的操作上的默认服务级别
maxConcurrentOperationCount
排队操作中可以同时执行的最大数.
NSOperationQueueDefaultMaxConcurrentOperationCount
队列中可以并发执行的操作的默认最大数

挂起执行

suspended
表示队列是否在调度操作执行的活跃状态

配置队列

name
操作队列名称
underlyingQueue
用于执行操作的分发队列。

你可能感兴趣的:(NSOperationQueue)