iOS多线程简介 - Swift版本 2.多线程开发 -- NSOperation的简单使用

前面咱们已经讲完了 GCD 的基本概念以及基本使用, 如今让咱们来看看第二个多线程开发, NSOperation, 这个类是苹果在 GCD 的基础上再次开发的, 因此并不会太难.markdown


1.基本概念

NSOperation和 GCD 不太同样, 它不像 GCD 同样有各类队列, 只保留了自定义队列和全局队列.网络

所谓的主队列确定就是在主线程中运行的, 而自定义队列就是在后台运行的多线程

PS: 这里须要注意一下, Swift 在 iOS8.1的时候, 就已经把NSInvocationOperation这个方法禁用了, 只剩下NSBlockOperation.并发


2.NSOperation队列

func demo1() {
        // 自定义队列 - 方法一
        var block: NSBlockOperation = NSBlockOperation { () -> Void in
        println("\(NSThread.currentThread()) -- NSThread")
        }
        myQueue.addOperation(block)

        // 自定义队列 -- 方法二
        // 添加到自定义队列中
        // 全部自定义的队列都在子线程中执行

        // 新建线程是有开销的, 因此NSOperationQueue提供了一个方法
        // 在设置同时并发的最大线程时, 若是前一个线程工做完成, 但尚未销毁, 会新建线程
        // 应用场景: 网络开发中, 下载工做! (线程开销: CPU, MEM) 电量
        // 若是是3G, 开3个子线程
        // 若是是 Wifi, 就开6个子线程

        // 该方法使用来控制线程数量, 虽然也是不可控的, 但相对来说能够节省一些资源
        myQueue.maxConcurrentOperationCount = 1

        // 并发执行, 线程数量不可控
        for i in 0...9 {
            myQueue.addOperationWithBlock({ () -> Void in
                println("\(NSThread.currentThread()) i -- \(i)")
            })
        }

        // 在主线程中执行
        NSOperationQueue.mainQueue().addOperationWithBlock { () -> Void in
            println("\(NSThread.currentThread()) -- main")
        }

    }

NSOperation 和 GCD 不太同样, 若是咱们没有指定最小范围的子线程数量的话, 那么就会申请多个子线程, 但在 NSOperation 中能够设置最大子线程的接近值(maxConcurrentOperationCount).框架


3.依赖关系

在 NSOperation 中不一样的还有一种关系叫作依赖关系, 这个和 GCD 的串行队列有些类似, 一旦咱们设定好依赖关系以后, 就能够逐步依次往下执行.工具

func demo2() {
        var op1 = NSBlockOperation { () -> Void in
            println("\(NSThread.currentThread()) -- 下载图片")
        }
        var op2 = NSBlockOperation { () -> Void in
            println("\(NSThread.currentThread()) -- 修改图片")
        }
        var op3 = NSBlockOperation { () -> Void in
            println("\(NSThread.currentThread()) -- 保存图片")
        }
        var op4 = NSBlockOperation { () -> Void in
            println("\(NSThread.currentThread()) -- 更新界面")
        }

        // 添加依赖关系, 只有当前一个线程执行完才会去执行下一个依赖的线程
        op2.addDependency(op1)
        op3.addDependency(op2)
        op4.addDependency(op3)

        // 添加到线程
        myQueue.addOperation(op1)
        myQueue.addOperation(op2)
        myQueue.addOperation(op3)

        // PS: 全部界面的更新都是在主线程中完成的
//        myQueue.addOperation(op4)
        NSOperationQueue.mainQueue().addOperation(op4)

    }

PS: 注意一点, 这里的依赖关系咱们须要写的很是明确, 并且不能循环依赖, 不然程序就会出问题了.性能


4.总结

在必定的程度上, NSOperation的性能比 GCD 的要稍微差一点, 但在大多数状况下是能够忽略不计的, 若是非要使用并发, 那么 NSOperation 是首选的工具.ui

但也有一些框架是使用 NSOperation 的接口, 底层倒是用 GCD 实现的, 好比 AFNetworkingspa


好了, 此次咱们就讲到这里, 下次咱们继续~~线程

相关文章
相关标签/搜索