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.NSOoperation常用操作,创建队列,设置最大并发数。

     

  //创建队列

        let queue = OperationQueue()

        //设置最大并发数

        queue.maxConcurrentOperationCount=2

        

        //创建operation

        let operation = BlockOperation.init {

            print("doSomething1 \(Thread.current)")

        }

        let operation2=BlockOperation.init {

            print("doSomething4 \(Thread.current)")

        }

        //添加到队列中的operation将自动异步执行

        queue.addOperation(operation)

        queue.addOperation(operation2)

        //当operation有多个任务的时候会自动分配多个线程并发执行,

        //如果只有一个任务,会自动在主线程同步执行

        

        //operation.start()

        

        operation.addExecutionBlock {

        print("doSomething2 \(Thread.current)")

        }

        

        operation.addExecutionBlock {

            print("doSomething3 \(Thread.current)")

        }

        

       

    **************//还有一种方式,直接将operation的blcok直接加入到队列

        

      queue.addOperation {

              print("doSomething5  \(Thread.current)")

        }

        queue.addOperation { 

            print("doSomething6  \(Thread.current)")

        }

        queue.addOperation { 

            print("doSomething7  \(Thread.current)")

        }

        queue.addOperation { 

            print("doSomething8 \(Thread.current)")

            }

   

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

        

        

        //创建队列

        let queue = OperationQueue.init()


        let operationA = BlockOperation.init
 { 

            print("print A")

        }

        let operationB = BlockOperation.init
 { 

            print("print B")

        }

        let operationC = BlockOperation.init
 { 

            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 = OperationQueue()

        let operation = BlockOperation.init {

            

        }

       

            operation.completionBlock = doSomething

            queue.addOperation(operation)

        }

        func doSomething(){

            print("doSomething")

        }

    




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

    

        let queue = OperationQueue.init()

        queue.addOperation { () -> Void in

            print("子线程  \(Thread.current)")

            OperationQueue.main.addOperation({

               print("主线程  \(Thread.current)")

            })

          

        }

    }



 注意:

        

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

        

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值