1 多線程是什么
多線程是個復雜的概念驴一,按字面意思是同步完成多項任務(wù)休雌,提高了資源的使用效率,從硬件肝断、操作系統(tǒng)杈曲、應(yīng)用軟件不同的角度去看,多線程被賦予不同的內(nèi)涵胸懈,對于硬件鱼蝉,現(xiàn)在市面上多數(shù)的CPU都是多核的,多核的CPU運算多線程更為出色箫荡;從操作系統(tǒng)角度,是多任務(wù)渔隶,現(xiàn)在用的主流操作系統(tǒng)都是多任務(wù)的羔挡,可以一邊聽歌洁奈、一邊寫博客;對于應(yīng)用來說绞灼,多線程可以讓應(yīng)用有更快的回應(yīng)利术,可以在網(wǎng)絡(luò)下載時,同時響應(yīng)用戶的觸摸操作低矮。在iOS應(yīng)用中印叁,對多線程最初的理解,就是并發(fā)军掂,它的含義是原來先做燒水轮蜕,再摘菜,再炒菜的工作蝗锥,會變成燒水的同時去摘菜跃洛,最后去炒菜。
2 iOS 中的多線程
iOS中的多線程终议,是Cocoa框架下的多線程汇竭,通過Cocoa的封裝,可以讓我們更為方便的使用線程穴张,做過C++的同學可能會對線程有更多的理解细燎,比如線程的創(chuàng)立,信號量皂甘、共享變量有認識玻驻,Cocoa框架下會方便很多,它對線程做了封裝叮贩,有些封裝击狮,可以讓我們創(chuàng)建的對象,本身便擁有線程益老,也就是線程的對象化抽象彪蓬,從而減少我們的工程,提供程序的健壯性捺萌。
GCD是(Grand Central Dispatch)的縮寫 档冬,從系統(tǒng)級別提供的一個易用地多線程類庫,具有運行時的特點桃纯,能充分利用多核心硬件酷誓。GCD的API接口為C語言的函數(shù),函數(shù)參數(shù)中多數(shù)有Block态坦,關(guān)于Block的使用參看這里盐数,為我們提供強大的“接口”,對于GCD的使用參見本文
NSOperation與Queue
NSOperation是一個抽象類伞梯,它封裝了線程的細節(jié)實現(xiàn)玫氢,我們可以通過子類化該對象帚屉,加上NSQueue來同面向?qū)ο蟮乃季S,管理多線程程序漾峡。具體可參看這里:一個基于NSOperation的多線程網(wǎng)絡(luò)訪問的項目攻旦。
NSThread
NSThread是一個控制線程執(zhí)行的對象,它不如NSOperation抽象生逸,通過它我們可以方便的得到一個線程牢屋,并控制它。但NSThread的線程之間的并發(fā)控制槽袄,是需要我們自己來控制的烙无,可以通過NSCondition實現(xiàn)。
參看
其他多線程
在Cocoa的框架下掰伸,通知皱炉、Timer和異步函數(shù)等都有使用多線程,(待補充).
3 iOS多線程常見面試題
在項目什么時候選擇使用GCD狮鸭,什么時候選擇NSOperation合搅?
項目中使用NSOperation的優(yōu)點是NSOperation是對線程的高度抽象,在項目中使用它歧蕉,會使項目的程序結(jié)構(gòu)更好灾部,子類化NSOperation的設(shè)計思路,是具有面向?qū)ο蟮膬?yōu)點(復用惯退、封裝)赌髓,使得實現(xiàn)是多線程支持,而接口簡單催跪,建議在復雜項目中使用锁蠕。
項目中使用GCD的優(yōu)點是GCD本身非常簡單、易用懊蒸,對于不復雜的多線程操作荣倾,會節(jié)省代碼量,而Block參數(shù)的使用骑丸,會是代碼更為易讀舌仍,建議在簡單項目中使用。