• 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("操作结束")
  • 相关阅读:
    java 开发面试题小整理(二)
    Java 字符串比较小知识
    适配器、工厂模式、线程池、线程组、互斥锁、Timer类、Runtime类、单例设计模式(二十四)
    多线程、死锁、线程安全、同步方法、代码块、休眠、守护线程、Thread、Runnable(二十三)
    RabbitMQ的几种典型使用场景
    SQL一些问题
    Redis和Memcached的区别
    Mongodb 使用场景和不使用场景
    Adapter as a WCF Binding
    ASP.NET MVC使用Filter解除Session, Cookie等依赖
  • 原文地址:https://www.cnblogs.com/sunyanyan/p/5364730.html
Copyright © 2020-2023  润新知