iOS多线程编程之NSOperation

来源:互联网 发布:淘宝优惠券怎么做兼职 编辑:程序博客网 时间:2024/05/21 06:35

多线程编程之NSOperation类

一、     基本了解

1、     NSOperation类是一个抽象类(不能直接使用),其子类有NSBlockOperation和NSInvocationOperation,(swift中取消,因为不安全)及自定义NSOperation的子类(继承是需要实现其Main方法)

2、     NSOperation 和NSOperationQueue 分别对应 GCD 的任务 和 队列

二、     操作步骤

1、     创建NSOperation同时将要执行的任务封装到一个 NSOperation 对象中。

2、     将此任务添加到一个 NSOperationQueue 对象中(开始时需要创建一个队列)。

3、     NSOperationQueue自动取出队列中任务对象,放在线程中执行

注意:

       a、当Operation有多个任务时回自动分配对个线程并发执行,只有一个任务则会在主线程同步执行。

      b、添加到队列中任务将自动异步执行

扩展:

a、通过使用Operation的addExcutionBlock方法可以添加多个任务

b、可以使用OperationQueue的addOperationWithBlock{block}直接将Block添加到队列

c、OperationQueue对象中有一个参数:MaxConcurrentOperationCount可以设置最大并发数(如果需要串行,设置为1即可)

 

三、     NSOperation操作依赖

依赖:当前一个操作执行之后,后一个操作才能执行。如获打开文件与读写文件。

实现:在创建好的Operation对象中使用addDependency(后一个操作)方法即可。

示例代码:

      //创建队列

        let queue =NSOperationQueue()

       

        let operationA =NSBlockOperation { () -> Void in

            print("printA")

        }

        let operationB =NSBlockOperation { () -> Void in

            print("printB")

        }

        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)

注意:不要设置循环依赖或者死等依赖

四、     NSOperation操作调用(函数)

可以在一个任务操作中调用另一个操作,使用ConpletionBlock

示例代码如下:

//创建队列

        let queue =NSOperationQueue()

        let operation =NSBlockOperation { () -> Void in

            print("printA")

        }

       operation.completionBlock = doSomething

       queue.addOperation(operation)

    }

    func doSomething(){

       print("doSomething")

}

           

五、     线程通信

在子线程中嵌套主线程()即可

示例代码:

/创建队列

        let queue =NSOperationQueue()

       queue.addOperationWithBlock { () -> Void in

            print("子线程  \(NSThread.currentThread())")

           NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in

                print("主线程  \(NSThread.currentThread())")

            })

        }


问题:swift中有抽象类吗?NSOperation在swift中是抽象类吗?

详细内容参考:swift多线程NSOperation使用

                          简书-关于IOS多线程,你看我就够了

              实例:推酷-在Swift中使用NSOperation和NSOperationQueue


0 0
原创粉丝点击