iOS利用協議給控制器解耦

寫在最前

? 以下方案的思路來自于項目組的同事LEAF

現狀

?在iOS開發(fā)中枉侧,對于根據不同的事件跳轉到不同的控制器這種操作,相信大家早已司空見慣老充,因此對于下面這樣的代碼福侈,一定不會陌生:

代碼1(控制器跳轉)

?也許有人問了,這代碼有什么問題谈飒?怎么說了岂座,其實代碼本身沒什么問題,如果跳轉事件不多杭措,更沒有什么問題费什,但是如果需要跳轉的控制器多達10個?20個手素?乃至更多的時候鸳址,你會就發(fā)現你的頭文件和方法列表大概就是這樣的:(為了不刷屏赘那,就只寫這么多,更多的可以想見氯质,代碼太美...)

代碼2(冗長的import)
代碼3(冗長的相似方法)

問題

?這樣的代碼最大的問題就是耦合募舟,你當前的控制器必須 “# import ”所有要跳轉到的控制器頭文件,要知道對方什么類名闻察,包含對方的頭文件等拱礁,這會導致將來如果需要替換當前某個目標控制器,就不得不去修改所有import過他的地方辕漂,還難免出現遺漏呢灶,這儼然是個悲劇...

解決辦法

?遇到上面的問題怎么辦呢?理所當然的想法是钉嘹,將跳轉部分的代碼抽離出來鸯乃,讓當前控制器不再依賴目標控制器的頭文件,Good idea跋涣!問題是怎么抽離缨睡?

以下是我們項目的解決方案:

第一步:事件分發(fā)

?將每次跳轉的過程看成是一個跳轉事件,那么就可以新建一個繼承自NSObject的跳轉管理器陈辱,用來管理所有的這些事件奖年,也可以說成是“事件分發(fā)管理器”。使用者只需要傳入一個事件名稱沛贪,管理器就可以根據不同的事件來處理(目前我們項目還只是用來做跳轉事件分發(fā))陋守。iOS常見的一般就是跳轉到一個自定義的UIViewController或者AppStore兩種,所以管理器會提供兩個方法(跳轉AppStore是系統已經給定的控制器利赋,所以這里主要討論自定義的控制器跳轉水评。):

代碼4(事件分發(fā)管理器)

第二步:事件注冊

?聽起來很高大上對不對?其實代碼還是很簡單的媚送,直接上代碼吧中燥,更容易理解。

代碼5(注冊表)

其實就是為了規(guī)范事件名稱的管理季希,如果事件散落各處褪那,對于后期管理和維護幽纷,簡直是災難式塌,這個相信程序猿都會懂。另外一點就是放在一起便于查錯友浸,對峰尝,就是為了查錯!

第三步:協議(重點收恢!重點N溲А)

?第二步的時候其實已經出現了“HPEventsProtocol”的影子祭往,問題是,這個用來干嘛火窒?又該怎么用呢硼补?

?對于程序猿來說,廢話太多是木有用的~~~熏矿。注釋什么的已骇,真的已經不能再詳細了,所以請直接看代碼:

代碼6(協議)

?說完了協議票编,下面是說說怎么用的時候了褪储,畢竟是騾子是馬,它都得先溜完才知道慧域。

第四步:實現

1. 遵守協議(以HPNewsListViewController為例)

代碼7(控制遵守協議)

2. 實現協議方法(分為校驗參數以及生成實例兩步)

代碼8(實現協議方法)

3. 事件分發(fā)管理器事件處理:

代碼9(通過協議驗證參數鲤竹,然后跳轉)

第五步:調用

?經過以上的操作后,現在跳轉已經不需要#import目標控制器啦昔榴,只要目標控制器遵守協議辛藻,并在注冊表中注冊,就可以直接使用以下方法進行調用:

代碼10(調用)

?完成互订!是不是很簡單揩尸?代碼其實并不復雜,簡單才是硬道理屁奏,關鍵還是看方法岩榆。

寫在最后

?通過以上操作,我們就實現了一個事件分發(fā)控制器坟瓢,優(yōu)點主要體現在兩方面勇边,第一:不需要再在控制器中#import各種目標控制器。第二:當跳轉發(fā)生改變折联,或者原來的控制器不需要使用粒褒,而重新啟動新的控制器的時候,只需要改一個注冊表中對應的value就可以诚镰。

? 當然奕坟,該方法并不是說就完美或者是什么標準的方法,如果有朋友有更好的方法提供清笨,請分享給我月杉,謝謝!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末抠艾,一起剝皮案震驚了整個濱河市苛萎,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖腌歉,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛙酪,死亡現場離奇詭異,居然都是意外死亡翘盖,警方通過查閱死者的電腦和手機桂塞,發(fā)現死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來馍驯,“玉大人藐俺,你說我怎么就攤上這事∧嗤” “怎么了欲芹?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吟吝。 經常有香客問我菱父,道長,這世上最難降的妖魔是什么剑逃? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任浙宜,我火速辦了婚禮,結果婚禮上蛹磺,老公的妹妹穿的比我還像新娘粟瞬。我一直安慰自己,他們只是感情好萤捆,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布裙品。 她就那樣靜靜地躺著,像睡著了一般俗或。 火紅的嫁衣襯著肌膚如雪市怎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天辛慰,我揣著相機與錄音区匠,去河邊找鬼。 笑死帅腌,一個胖子當著我的面吹牛驰弄,可吹牛的內容都是我干的。 我是一名探鬼主播速客,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼戚篙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了挽封?” 一聲冷哼從身側響起已球,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎辅愿,沒想到半個月后智亮,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡点待,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年阔蛉,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片癞埠。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡状原,死狀恐怖,靈堂內的尸體忽然破棺而出苗踪,到底是詐尸還是另有隱情颠区,我是刑警寧澤,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布通铲,位于F島的核電站毕莱,受9級特大地震影響,放射性物質發(fā)生泄漏颅夺。R本人自食惡果不足惜朋截,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吧黄。 院中可真熱鬧部服,春花似錦、人聲如沸拗慨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赵抢。三九已至瘫想,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間昌讲,已是汗流浹背国夜。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留短绸,地道東北人车吹。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像醋闭,于是被迫代替她去往敵國和親窄驹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,145評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理证逻,服務發(fā)現乐埠,斷路器,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 積分制開始實施了,初見佳績丈咐!
    尚源希媽媽閱讀 106評論 0 0
  • Day10 夏日青春漾 “想過和很多人一起夜游成都瑞眼,可是沒想到是你】醚罚”剛才我在明信片上如是寫到伤疙。回首這十天辆影,有太多...
    TrickPow閱讀 219評論 0 0
  • 第一天 1月23號上午8點之前出發(fā)徒像,下午17點到達美生中央廣場 第一階段(2小時,153.5公里) 膠寧高架---...
    junegod閱讀 299評論 0 0