• iOS开发:Swift多线程NSOperation的使用


    介绍:

      NSOperation是基于GCD实现,封装了一些更为简单实用的功能,因为GCD的线程生命周期是自动管理,所以NSOperation也是自动管理。NSOperation配合NSOperationQueue也可以实现多线程。

    实现步骤

      第1步:将一个操作封装到NSOperation对象中

      第2步:将NSOperation对象放入NSOperationQueue队列

      第3步:NSOperationQueue自动取出队列中的NSOperation对象放到一条线程中执行

    具体实现

      在swift中的实现方式分2种(oc还多了一个NSInvocationOperation,并且在oc中NSOperation是个抽象类):

      1.NSBlockOperation

      2.自定义子类继承NSOperation

    目录:

    1. NSOperation常用操作
    2. NSOperation操作依赖
    3. NSOperation操作监听
    4. NSOperation线程通信
    5. 注意

    1.NSOoperation常用操作,创建队列,设置最大并发数。

    //创建队列
            let queue = NSOperationQueue()
            //设置最大并发数
            queue.maxConcurrentOperationCount=2
            
            //创建operation
            let operation = NSBlockOperation { () -> Void in
                print("doSomething1 (NSThread.currentThread())")
            }
            
            //当operation有多个任务的时候会自动分配多个线程并发执行,
            //如果只有一个任务,会自动在主线程同步执行
            //operation.start()
            
            operation.addExecutionBlock { () -> Void in
                print("doSomething2 (NSThread.currentThread())")
            }
            
            operation.addExecutionBlock { () -> Void in
                print("doSomething3 (NSThread.currentThread())")
            }
            
            let operation2=NSBlockOperation { () -> Void in
                print("doSomething4 (NSThread.currentThread())")
            }
            
            //添加到队列中的operation将自动异步执行
            queue.addOperation(operation)
            queue.addOperation(operation2)
            
            //还有一种方式,直接将operation的blcok直接加入到队列
            queue.addOperationWithBlock { () -> Void in
                print("doSomething5 block (NSThread.currentThread())")
            }
            queue.addOperationWithBlock { () -> Void in
                print("doSomething6 block (NSThread.currentThread())")
            }
            queue.addOperationWithBlock { () -> Void in
                print("doSomething7 block (NSThread.currentThread())")
            }
            queue.addOperationWithBlock { () -> Void in
                print("doSomething8 block (NSThread.currentThread())")
            } 

    2.NSOperation操作依赖,可设置一个操作在另一个操作完成后在执行

     //创建队列
            let queue = NSOperationQueue()
            
            let operationA = NSBlockOperation { () -> Void in
                print("print A")
            }
            let operationB = NSBlockOperation { () -> Void in
                print("print B")
            }
            let operationC = NSBlockOperation { () -> Void in
                print("print C")
            }
            
            //B等A执行完才执行
            operationB.addDependency(operationA)
            //C等B执行完才执行
            operationC.addDependency(operationB)
            
            
            queue.addOperation(operationA)
            queue.addOperation(operationB)
            queue.addOperation(operationC)

    3.NSOperation操作监听,一个操作完成后调用另一个操作:

       func operationCompletion(){
            //创建队列
            let queue = NSOperationQueue() 
            let operation = NSBlockOperation { () -> Void in
                print("print A")
            } 
            operation.completionBlock = doSomething
            queue.addOperation(operation)
        }
        func doSomething(){
            print("doSomething")
        }

    4.NSOperation线程通信,NSOperationQueue.mainQueue。

        //创建队列
            let queue = NSOperationQueue()
            queue.addOperationWithBlock { () -> Void in
                print("子线程  (NSThread.currentThread())")
                NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
                    print("主线程  (NSThread.currentThread())")
                })
            }

    注意

      1.在使用队列任务的时候,内存警告的时候可使用队列的cancelAllOperations函数取消所有操作,注意一旦取消不可恢复。亦可设置队列的suspended属性暂停和恢复队列。

      2.在设置操作依赖的时候不能设置循环依赖。

    完!

  • 相关阅读:
    环境部署:Linux下查看JDK安装路径
    环境部署(一):Linux下安装JDK
    linux常见命令
    设计用例
    测试用例的优先级
    快速幂和快速乘
    docker-compose安装
    jmeter通过命令生成自动测试报告
    jmeter环境变量配置
    java将毫秒转化为当前时间
  • 原文地址:https://www.cnblogs.com/tonge/p/5039114.html
Copyright © 2020-2023  润新知