1. GCD 的核心是 C 語言寫的系統服務,執行和操作簡單高效,因此 NSOperation 底層也通過 GCD 實現,換個說法就是 NSOperation 是對 GCD 更高層次的抽象,這是他們之間最本質的區別。因此如果希望自定義任務,建議使用 NSOperation;
2. 依賴關系,NSOperation 可以設置兩個 NSOperation 之間的依賴,第二個任務依賴于第一個任務完成執行,GCD 無法設置依賴關系,不過可以通過dispatch_barrier_async來實現這種效果;
3. KVO(鍵值對觀察),NSOperation 和容易判斷 Operation 當前的狀態(是否執行,是否取消),對此 GCD 無法通過 KVO 進行判斷;
4. 優先級,NSOperation 可以設置自身的優先級,但是優先級高的不一定先執行,GCD 只能設置隊列的優先級,無法在執行的 block 設置優先級;
5. 繼承,NSOperation 是一個抽象類,實際開發中常用的兩個類是 NSInvocationOperation 和 NSBlockOperation ,同樣我們可以自定義 NSOperation,GCD 執行任務可以自由組裝,沒有繼承那么高的代碼復用度;
6. 效率,直接使用 GCD 效率確實會更高效,NSOperation 會多一點開銷,但是通過 NSOperation 可以獲得依賴,優先級,繼承,鍵值對觀察這些優勢,相對于多的那么一點開銷確實很劃算,魚和熊掌不可得兼,取舍在于開發者自己;
更多:iOS面試題合集