iOS -- 用 handler 塊 降低代碼分散程度 (23)

用 handler 塊 降低代碼分散程度

為用戶界面編碼時, 一種常見的范式是 '異步執(zhí)行任務(wù)', 這種范式的好處在于: 處理用戶界面的顯示及觸摸操作所用的線程, 不會因為要執(zhí)行 I/O 或網(wǎng)絡(luò)通信這類耗時的任務(wù)而阻塞, 這個線程通常稱為主線程, 假設(shè)把執(zhí)行異步任務(wù)的方法做成同步的 ,那么在執(zhí)行任務(wù)時, 用戶界面就變得無法響應(yīng)用戶輸入了. 某些情況下, 如果應(yīng)用程序在一定時間內(nèi)無響應(yīng), 那么就會自動終止, iOS 系統(tǒng)上的應(yīng)用程序就是如此. '系統(tǒng)監(jiān)控器'在發(fā)現(xiàn)某個應(yīng)用程序的主線程已經(jīng)阻塞了一段時間之后, 就會令其終止.

異步方法在執(zhí)行完成任務(wù)后, 需要以某種手段通知相關(guān)代碼, 實現(xiàn)此功能有很多方法. 常用的技巧是設(shè)計一個委托協(xié)議. 令關(guān)注此時間的對象遵從該協(xié)議. 對象稱為 delegate 之后,就可以在相關(guān)時間發(fā)生時 (例如某個異步任務(wù)執(zhí)行完畢時) 得到通知了.

這種做法確實可行,而且沒有什么錯誤,然而如果改用 塊 改寫的話, 代碼會更清晰, 塊 可以令這種 API 變得更緊致, 同時也令開發(fā)者調(diào)用起來更加方便,

與使用委托模式的代碼相比. 用 塊 寫出的代碼顯然更為整潔, 異步任務(wù)執(zhí)行完畢之后所需運行的業(yè)務(wù)邏輯. 和啟動異步任務(wù)所用的代碼放在一起,而且,由于 塊 聲明在創(chuàng)建獲取器的范圍里面, 所以它可以訪問此范圍內(nèi)的全部變量,

這種寫法的缺點是: 由于全部邏輯都寫在一起. 所以會令 塊 變的比較長, 且比較復(fù)雜. 然而只用一個 塊 的寫法也有好用, 那就是更為靈活; 比方說,在傳入錯誤信息時,把成功情況和失敗情況放在同一個 塊 中,還有個優(yōu)點,調(diào)用 API 的代碼可能會在處理成功響應(yīng)的過程中發(fā)現(xiàn)錯誤, 比方說,返回的數(shù)據(jù)可能太短, 這種情況下需要和網(wǎng)絡(luò)獲取器所認(rèn)定的失敗情況按同一方式處理. 此時, 如果采用單一 塊 的寫法,那么就能把這種情況 和 獲取器所認(rèn)定的失敗情況統(tǒng)一處理了, 要是把成功情況和失敗情況交給兩個不同的處理程序來負責(zé), 那么就沒辦法共享同一份錯誤處理代碼了, 除非把這段代碼單獨放在一個方法里.而這又違背我們想把全部邏輯代碼都放在一處的初衷.

總體來說, 建議使用同一個 塊 來處理成功與失敗情況,

有時候需要在相關(guān)時間點執(zhí)行回調(diào)操作, 這種情況也可以使用 handler 塊, 比方說,調(diào)用網(wǎng)絡(luò)數(shù)據(jù)獲取器的代碼, 也許想在每次有下載進度時 都得到通知, 這可以通過委托模式實現(xiàn), 不過也可以使用 handler 塊, 把處理下載進度的 handler 定義成 塊 類型,并新增一個此類型的屬性.

typedef void (^EOCNetworkFetcherProgressHandler)(float progress);

@property (nonatomic, copy) EOCNetworkFetcherProgressHandler progressHandler;

這種寫法很好, 因為它還是能把所有業(yè)務(wù)邏輯都放在一起: 也就是把創(chuàng)建網(wǎng)絡(luò)數(shù)據(jù)獲取器和定義 progress 的代碼寫在一起.

基于 handler 來設(shè)計 API 還有個原因, 就是某些代碼必須運行在特定的線程上, 比方說, Cocoa 與 Cocoa Touch 中的 UI 操作必須在主線程上執(zhí)行, 這就相當(dāng)于 GCD 中的 '主隊列', 因此,最好能由調(diào)用 API 的人來決定 handler 應(yīng)該運行在哪個線程上. NSNotificationCenter 就屬于這種 API ,它提供了一個方法, 調(diào)用者可以經(jīng)由此方法來注冊想要接收的通知,等到相關(guān)事件發(fā)生時, 通知中心就會執(zhí)行注冊好的那個 塊,調(diào)用者可以指定某個 塊應(yīng)該安排在哪個執(zhí)行隊列里, 然而這不是必須的, 若是沒有指定隊列, 則按默認(rèn)方式執(zhí)行, 也就是說, 將由投遞通知的那個線程來執(zhí)行,

總結(jié):

在創(chuàng)建對象時, 可以使用內(nèi)聯(lián)的 handler 塊將相關(guān)業(yè)務(wù)邏輯一并聲明.

在有多個實例需要監(jiān)控時,如果采用委托模式,那么經(jīng)常需要根據(jù)傳入的對象來切換, 而若改用 handler 塊 來實現(xiàn),則可直接將 塊 與相關(guān)對象放在一起.

設(shè)計 API 時如果用到了 handler 塊, 那么可以增加一個參數(shù), 使得調(diào)用者可通過此參數(shù)來決定應(yīng)該把 塊 安排在哪個隊列上執(zhí)行.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末扭仁,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子厅翔,更是在濱河造成了極大的恐慌乖坠,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刀闷,死亡現(xiàn)場離奇詭異熊泵,居然都是意外死亡,警方通過查閱死者的電腦和手機甸昏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門顽分,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人施蜜,你說我怎么就攤上這事卒蘸。” “怎么了翻默?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵缸沃,是天一觀的道長。 經(jīng)常有香客問我修械,道長趾牧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任肯污,我火速辦了婚禮翘单,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蹦渣。我一直安慰自己哄芜,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布剂桥。 她就那樣靜靜地躺著忠烛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪权逗。 梳的紋絲不亂的頭發(fā)上美尸,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天,我揣著相機與錄音斟薇,去河邊找鬼师坎。 笑死,一個胖子當(dāng)著我的面吹牛堪滨,可吹牛的內(nèi)容都是我干的胯陋。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼遏乔!你這毒婦竟也來了义矛?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤盟萨,失蹤者是張志新(化名)和其女友劉穎凉翻,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捻激,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡制轰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了胞谭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片垃杖。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖丈屹,靈堂內(nèi)的尸體忽然破棺而出调俘,到底是詐尸還是另有隱情,我是刑警寧澤泉瞻,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布脉漏,位于F島的核電站,受9級特大地震影響袖牙,放射性物質(zhì)發(fā)生泄漏侧巨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一鞭达、第九天 我趴在偏房一處隱蔽的房頂上張望司忱。 院中可真熱鬧,春花似錦畴蹭、人聲如沸坦仍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽繁扎。三九已至,卻和暖如春糊闽,著一層夾襖步出監(jiān)牢的瞬間梳玫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工右犹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留提澎,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓念链,卻偏偏與公主長得像盼忌,于是被迫代替她去往敵國和親积糯。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 《編寫高質(zhì)量iOS與OS X代碼的52個有效方法》--第六章 第39條(ps:此乃讀書筆記谦纱,加深記憶看成,僅供大家參考...
    z_zero閱讀 393評論 0 0
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,328評論 25 707
  • 媽媽绍昂,我想對你說,你把我養(yǎng)到這么大我確實很感激偿荷,但是你的暴脾氣讓我們之間缺少了很多溝通。因為我只要說的不合你的心意...
    月落霂霡閱讀 200評論 0 1
  • 二維碼已經(jīng)滲透到生活中的方方面面唠椭,不管到哪跳纳,我們都可以用掃一掃解決大多數(shù)問題。二狗為了準(zhǔn)備應(yīng)對以后項目中會出現(xiàn)的二...
    AlbenXie閱讀 293評論 0 1
  • “不知道這個地下空間有多大贪嫂,沒有參照物的情況下太容易迷失方向了寺庄。所以我們四個人分成兩排走,互相都可以照應(yīng)力崇、嗯......
    灰火閱讀 301評論 0 1