多線程 Block

1 什麼是block

對於閉包(block),有很多定義,其中閉包就是能夠讀取其它函數內部變量的函數,這個定義即接近本質又較好理解。對於剛接觸Block的同學,會覺得有些繞,因爲我們習慣寫這樣的程序main(){ funA();} funA(){funB();} funB(){.....}; 就是函數main調用函數A,函數A調用函數B... 函數們依次順序執行,但現實中不全是這樣的,例如項目經理M,手下有3個程序員A、B、C,當他給程序員A安排實現功能F1時,他並不等着A完成之後,再去安排B去實現F2,而是安排給A功能F1,B功能F2,C功能F3,然後可能去寫技術文檔,而當A遇到問題時,他會來找項目經理M,當B做完時,會通知M,這就是一個異步執行的例子。在這種情形下,Block便可大顯身手,因爲在項目經理M,給A安排工作時,同時會告訴A若果遇到困難,如何能找到他報告問題(例如打他手機號),這就是項目經理M給A的一個回調接口,要回掉的操作,比如接到電話,百度查詢後,返回網頁內容給A,這就是一個Block,在M交待工作時,已經定義好,並且取得了F1的任務號(局部變量),卻是在當A遇到問題時,才調用執行,跨函數在項目經理M查詢百度,獲得結果後回調該block。

2 block 實現原理
Objective-C是對C語言的擴展,block的實現是基於指針和函數指針。
從計算語言的發展,最早的goto,高級語言的指針,到面嚮對象語言的block,從機器的思維,一步步接近人的思維,以方便開發人員更爲高效、直接的描述出現實的邏輯(需求)。
下面是兩篇很好的介紹block實現的博文
iOS中block實現的探究
談Objective-C Block的實現


3 block的使用
使用實例
cocoaTouch框架下動畫效果的Block的調用

使用typed聲明block
typedef void(^didFinishBlock) (NSObject *ob);
這就聲明瞭一個didFinishBlock類型的block,
然後便可用
@property (nonatomic,copy) didFinishBlock  finishBlock;
聲明一個block對象,注意對象屬性設置爲copy,接到block 參數時,便會自動複製一份。

__block是一種特殊類型,
使用該關鍵字聲明的局部變量,可以被block所改變,並且其在原函數中的值會被改變。


4 常見系列面試題
面試時,面試官會先問一些,是否瞭解block,是否使用過block,這些問題相當於開場白,往往是下面一系列問題的開始,所以一定要如實根據自己的情況回答。
1 使用block和使用delegate完成委託模式有什麼優點?
首先要了解什麼是委託模式,委託模式在iOS中大量應用,其在設計模式中是適配器模式中的對象適配器,Objective-C中使用id類型指向一切對象,使委託模式在iOS中的實現更爲方便。瞭解委託模式的細節:
 iOS設計模式----委託模式
使用block實現委託模式,其優點是回調的block代碼塊定義在委託對象函數內部,使代碼更爲緊湊;
適配對象不再需要實現具體某個protocol,代碼更爲簡潔。


1 多線程是什麼
多線程是個複雜的概念,按字面意思是同步完成多項任務,提高了資源的使用效率,從硬件、操作系統、應用軟件不同的角度去看,多線程被賦予不同的內涵,對於硬件,現在市面上多數的CPU都是多核的,多核的CPU運算多線程更爲出色;從操作系統角度,是多任務,現在用的主流操作系統都是多任務的,可以一邊聽歌、一邊寫博客;對於應用來說,多線程可以讓應用有更快的迴應,可以在網絡下載時,同時響應用戶的觸摸操作。在iOS應用中,對多線程最初的理解,就是併發,它的含義是原來先做燒水,再摘菜,再炒菜的工作,會變成燒水的同時去摘菜,最後去炒菜。

2 iOS 中的多線程

iOS中的多線程,是Cocoa框架下的多線程,通過Cocoa的封裝,可以讓我們更爲方便的使用線程,做過C++的同學可能會對線程有更多的理解,比如線程的創立,信號量、共享變量有認識,Cocoa框架下會方便很多,它對線程做了封裝,有些封裝,可以讓我們創建的對象,本身便擁有線程,也就是線程的對象化抽象,從而減少我們的工程,提供程序的健壯性。

GCD是(Grand Central Dispatch)的縮寫 ,從系統級別提供的一個易用地多線程類庫,具有運行時的特點,能充分利用多核心硬件。GCD的API接口爲C語言的函數,函數參數中多數有Block,關於Block的使用參看這裏,爲我們提供強大的“接口”,對於GCD的使用參見本文


NSOperation與Queue
NSOperation是一個抽象類,它封裝了線程的細節實現,我們可以通過子類化該對象,加上NSQueue來同面向對象的思維,管理多線程程序。具體可參看這裏:一個基於NSOperation的多線程網絡訪問的項目。

NSThread
NSThread是一個控制線程執行的對象,它不如NSOperation抽象,通過它我們可以方便的得到一個線程,並控制它。但NSThread的線程之間的併發控制,是需要我們自己來控制的,可以通過NSCondition實現。
參看  iOS多線程編程之NSThread的使用


其他多線程
在Cocoa的框架下,通知、Timer和異步函數等都有使用多線程,(待補充).

3 iOS多線程常見面試題
在項目什麼時候選擇使用GCD,什麼時候選擇NSOperation?
項目中使用NSOperation的優點是NSOperation是對線程的高度抽象,在項目中使用它,會使項目的程序結構更好,子類化NSOperation的設計思路,是具有面向對象的優點(複用、封裝),使得實現是多線程支持,而接口簡單,建議在複雜項目中使用。
項目中使用GCD的優點是GCD本身非常簡單、易用,對於不復雜的多線程操作,會節省代碼量,而Block參數的使用,會是代碼更爲易讀,建議在簡單項目中使用。


2 多線程與block
GCD與Block
使用 dispatch_async 系列方法,可以以指定的方式執行block
GCD編程實例

dispatch_async的完整定義
   void dispatch_async(
   dispatch_queue_t queue,
   dispatch_block_t block);
功能:在指定的隊列裏提交一個異步執行的block,不阻塞當前線程

通過queue來控制block執行的線程。主線程執行前文定義的 finishBlock對象
dispatch_async(dispatch_get_main_queue(),^(void){finishBlock();});
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章