iOS-用Block代替Delegate實現callBack(回調)方法

剛開始學iOS開發的時候,swift剛出來,所以決定先學資料和第三方開源工具比較多的Objective-C,而那時候更多的資料都是在講使用Delegate的方法,這個方法也真的很好用,但是在某些地方,其實可以用更好的方法來取代。

研究別人的代碼

當自己有一定的代碼量以後,開始看得懂一些第三方library的實現原理,也開始驚嘆在Github上能夠擁有上千Star的library,比較一下自己和他們在實現同一個方法的寫法不同之處,可以一下子經驗值爆增…..

其實我每次寫完一個功能,總會覺得應該有更好的寫法,可能因為進步得很快,如果一個項目超過兩週,我甚至會在第三週的時候就把很多東西重寫一次,有些人可能覺得功能能夠實現出來就好了,但其實如果把邏輯簡化、用上更好的設計模式或實現方法,這對後面修改的人來說會方便非常多。

一個非常簡單的例子,如果你有很多tableView用了一些類似的cell,他們的差別在於有不同的按鈕功能或圖案,如果你使用代碼去寫一大堆cell,這樣每次用戶要求稍微修改一點內容的時候,比如cell上的按鈕想要移動幾個像素,你就會崩潰了。

相反,如果使用XIB設計一個Cell(變得直觀),然後用代碼去控制按鈕顯示的圖案或者隱藏,這樣就會讓修改人方便很多,你也不會累死自己。

而這次的大經驗值就是在某些地方用Block代替Delegate。

使用Delegate處理回調數據

我們寫App常常會跟Server獲取數據,獲取完以後封裝起來交給View去更新介面,那時候用Delegate寫起來有點像:

用Delegate方法會需要設置一個delegate屬性,用來調用回調方法,比如上面的fetchDataResult();
不知道是不是這個地方可不可以優化?其實就是因為每次都要寫這個空函數,讓我很想去找其他方法實現回調…
上面的方法還有個問題,就是調用結果是否成功我寫進了NSDictionary裡面,這樣調用者也會不知道調用字典中的什麼key才能知道獲取資料是不是失敗了。


 

上面這個方法就是調用FetchData完畢以後回調的函數。


 

有的人會乾脆直接寫兩個函數去調用,將成功和失敗分開,但如果調用的方法很多…會寫很多個空方法出來。

 

當然還有個比價好的方式就是把成功條件寫到函數的參數中。

 

用Block代替delegate

delegate用在這裏確實會變得複雜,而看到AFNetworking中使用block的方法時,我就有一種我超想學會的念頭。

調用他的manager方法後,可以直接在success和failure中寫上要執行的方法,
不用設置delegate不用寫空函數了!!!

實現簡單的Block回調方法

block的語法網上很多資料,這裏紀錄下回調的方法。

比如一個年齡判斷的函數,如果大於18就會去執行over18()這個函數,不然就執行under18();

調用者就可以實現不用設置delegate就執行回調的方法了:

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *