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


好了, 此次咱們就講到這裏, 下次咱們繼續~~線程

相關文章
相關標籤/搜索