NSOperationQueue简介

我们知道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("操作结束")
原文地址:https://www.cnblogs.com/sunyanyan/p/5364730.html