我们知道GCD中的队列有三种:主队列、串行队列和并行队列。NSOperationQueue更简单,只有两种:主队列和非主队列。
我们自己生成的NSOperationQueue对象都是非主队列,主队列可以用 mainQueue取得。
NSOperationQueue的主队列是串行队列,而且其中所有NSOperation都会在主线程中执行。
对于非主队列来说,一旦一个NSOperation被放入其中,那这个NSOperation一定是并发执行的。 NSOperationQueue会为每一个NSOperation创建线程并调用它的start方法。
KVO键值观察
- operations - read-only
- operationCount - read-only
- maxConcurrentOperationCount - readable and writable
- suspended - readable and writable
- name - readable and writable
获取特殊NSOperationQueue
- +(NSOperationQueue *)currentQueue
- 返回当前NSOperationQueue,如果当前线程不是在NSOperationQueue上运行则返回nil
- +(NSOperationQueue *)mainQueue
- 返回主线程的NSOperationQueue
管理队列中的Operation
-
-(void)addOperation:(NSOperation *)operation
- 加入到执行队列中,如果isReady则开始执行
-
-(void)addOperations:(NSArray<NSOperation *> *)ops waitUntilFinished:(BOOL)wait
- 批量加入执行operation,wait标志是否当前线程等到所有operation结束
-
-(void)addOperationWithBlock:(void (^)(void))block
- 相当于加入一个NSBlockOperation执行任务
-
-(void)cancelAllOperations
- 相当于加入一个NSBlockOperation执行任务
-
-(void)waitUntilAllOperationsAreFinished
- 当前线程等待,直到所有operation都执行结束
-
@property(readonly, copy) NSArray <__kindof NSOperation *> *operations
- 返回已加入执行operation的数组,当某个operation结束后会自动从这个数组清除
-
@property(readonly) NSUInteger operationCount
- 返回已加入执行operation的数目
-
@property NSInteger maxConcurrentOperationCount
- 设置最大并发执行数,如果为1则同时只有一个并发任务在运行,可控制顺序执行关系
-
@property(getter=isSuspended) BOOL suspended
queue.suspended = true //暂停queue中所有operation queue.suspended = false //恢复queue中所有operation
简单使用:
let operationQueue = NSOperationQueue()
let operation = NSBlockOperation { () -> Void in
print(NSThread.currentThread())
}
operation.addExecutionBlock { () -> Void in
print("execution block1 -- (NSThread.currentThread())")
}
operationQueue.addOperation(operation)
print("操作结束")