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