把代碼遷移到協(xié)調(diào)器上"

作者:Soroush Khanlou漫玄,原文鏈接,原文日期:2017-4-25
譯者:Cwift锉试;校對(duì):Crystal Sun纬纪;定稿:CMB

這篇文章是 Coordinators(協(xié)調(diào)器)進(jìn)階教程系列的第一篇。如果你沒(méi)有閱讀過(guò)原始的帖子及其后續(xù)只损,請(qǐng)務(wù)必首先查閱這些文章一姿。該系列將涵蓋幾項(xiàng)進(jìn)階的 Coordinator 使用技巧、疑點(diǎn)改执、常見(jiàn)問(wèn)題以及其他細(xì)碎的內(nèi)容啸蜜。讓我們開(kāi)始吧。

常有人問(wèn)我辈挂,如何把一個(gè)使用 Storyboard 構(gòu)建或者是使用純代碼編寫 ViewController 構(gòu)建的應(yīng)用重構(gòu)成使用 Coordinators 的應(yīng)用衬横。只要方法正確,重構(gòu)可以逐步完成终蒂。即使重構(gòu)未完成蜂林,你的應(yīng)用仍舊可以部署。

要實(shí)現(xiàn)這個(gè)目標(biāo)拇泣,最好的做法是從根路徑出發(fā)噪叙,在 Coordinators 中稱之為 “AppCoordinator”。AppDelegate 持有該 AppCoordinator霉翔,AppCoordinator 調(diào)度 App 可以加載的所有 ViewController睁蕾。

想要理解為什么從 App 的根路徑開(kāi)始,可以從反面來(lái)思考债朵。如果從一些葉子流程開(kāi)始(比如子眶,一個(gè) CheckoutCoordinator),那么需要保持對(duì)該 Coordinator 的強(qiáng)引用序芦,以防它被釋放臭杰。如果 Coordinator 被釋放,它內(nèi)部的代碼就都不能執(zhí)行了谚中。所以渴杆,深入一個(gè) App 中去寥枝,如果我們創(chuàng)建一個(gè) Coordinator,必須讓某個(gè)對(duì)象長(zhǎng)久地持有它磁奖。

有兩種方案可以防止對(duì)象被釋放囊拜。第一種方案是使用靜態(tài)引用。因?yàn)橄到y(tǒng)里可能只有一個(gè) CheckoutCoordinator点寥,所以很容易將其填充到一個(gè)全局變量中艾疟。雖然這種方案有效果,但是不是一個(gè)理想的選擇敢辩,因?yàn)槿肿兞孔璧K了可測(cè)試性和靈活性蔽莱。第二種方案是讓當(dāng)前展示的 ViewController 持有 Coordinator。這將迫使當(dāng)前的 ViewController 變得復(fù)雜一些戚长,但是可以降低 Coordinator 所管理的所有 ViewController 的復(fù)雜性盗冷。然而,這種關(guān)系本質(zhì)上是有缺陷的同廉。ViewController 是 Coordinator 的“孩子”仪糖,編程時(shí),孩子們不應(yīng)該不知道他們的父母是誰(shuí)迫肖。類似于一個(gè) UIView 持有了一個(gè) UIViewController 的引用:這種事是不該發(fā)生的锅劝。

如果你遇到了必須從子流程開(kāi)始的情況,你可以使用上述兩種方法之一蟆湖。但是故爵,如果可以選擇,我的建議是從根路徑開(kāi)始隅津。

從根路徑開(kāi)始的另一個(gè)好處是認(rèn)證流程通常更靠近 App 的根路徑诬垂。身份認(rèn)證是一個(gè)很好的流程,可以抽象成單獨(dú)的對(duì)象伦仍,很適合用來(lái)驗(yàn)證 App 中的 Coordinator结窘。

將 App 的 RootViewController 交付給 AppCoordinator 之后,你可以對(duì)代碼進(jìn)行 Commit/Pull Request/Code Review充蓝。因?yàn)槠渌?ViewController 仍在正常運(yùn)轉(zhuǎn)隧枫,所以 App 可以在這個(gè)未完工的狀態(tài)下繼續(xù)工作∥焦叮基于這點(diǎn)官脓,逐步改造,你可以將更多的 ViewController 交付給 Coordinator娜谊。將每個(gè)“流程”都交付給 Coordinator 之后确买,你可以提交代碼或者創(chuàng)建一個(gè) pr斤讥,不會(huì)影響 App 的正常工作纱皆。正如最佳重構(gòu)一樣湾趾,這些步驟只是移動(dòng)代碼,有時(shí)根據(jù)需要?jiǎng)?chuàng)建新的 Coordinator派草。

一旦所有的場(chǎng)景切換都轉(zhuǎn)移到了 Coordinator 中搀缠,你就可以開(kāi)始下一步的重構(gòu)了,例如將 iPhone 和 iPad 的 Coordinator 封裝到單獨(dú)的對(duì)象(而不是一個(gè)切換狀態(tài)的 Coordinator)近迁,讓子流程可復(fù)用艺普,更好地依賴注入,這些都可以應(yīng)用到你的新架構(gòu)中鉴竭。

本文由 SwiftGG 翻譯組翻譯歧譬,已經(jīng)獲得作者翻譯授權(quán),最新文章請(qǐng)?jiān)L問(wèn) http://swift.gg搏存。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瑰步,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子璧眠,更是在濱河造成了極大的恐慌缩焦,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件责静,死亡現(xiàn)場(chǎng)離奇詭異袁滥,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)灾螃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門题翻,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人睦焕,你說(shuō)我怎么就攤上這事藐握。” “怎么了垃喊?”我有些...
    開(kāi)封第一講書人閱讀 165,083評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵猾普,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我本谜,道長(zhǎng)初家,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,763評(píng)論 1 295
  • 正文 為了忘掉前任乌助,我火速辦了婚禮溜在,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘他托。我一直安慰自己掖肋,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布赏参。 她就那樣靜靜地躺著志笼,像睡著了一般沿盅。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纫溃,一...
    開(kāi)封第一講書人閱讀 51,624評(píng)論 1 305
  • 那天腰涧,我揣著相機(jī)與錄音,去河邊找鬼紊浩。 笑死窖铡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的坊谁。 我是一名探鬼主播费彼,決...
    沈念sama閱讀 40,358評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼口芍!你這毒婦竟也來(lái)了敌买?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,261評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤阶界,失蹤者是張志新(化名)和其女友劉穎虹钮,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體膘融,經(jīng)...
    沈念sama閱讀 45,722評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡芙粱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了氧映。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片春畔。...
    茶點(diǎn)故事閱讀 40,030評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖岛都,靈堂內(nèi)的尸體忽然破棺而出律姨,到底是詐尸還是另有隱情,我是刑警寧澤臼疫,帶...
    沈念sama閱讀 35,737評(píng)論 5 346
  • 正文 年R本政府宣布择份,位于F島的核電站,受9級(jí)特大地震影響烫堤,放射性物質(zhì)發(fā)生泄漏荣赶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評(píng)論 3 330
  • 文/蒙蒙 一鸽斟、第九天 我趴在偏房一處隱蔽的房頂上張望拔创。 院中可真熱鬧,春花似錦富蓄、人聲如沸剩燥。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,941評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)灭红。三九已至氛改,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間比伏,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,057評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工疆导, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留赁项,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,237評(píng)論 3 371
  • 正文 我出身青樓澈段,卻偏偏與公主長(zhǎng)得像悠菜,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子败富,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評(píng)論 2 355

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,161評(píng)論 25 707
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理悔醋,服務(wù)發(fā)現(xiàn),斷路器兽叮,智...
    卡卡羅2017閱讀 134,659評(píng)論 18 139
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)芬骄、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,105評(píng)論 4 62
  • 公交車上 她腦后的我 看著她的后腦 我離她的腦海如此之近 卻進(jìn)入不了她的想象 她翹起的一根頭發(fā) 輕抵著我的臉龐 我...
    書_路閱讀 245評(píng)論 4 3
  • 在高鐵上讀完鹦聪。因?yàn)橹白x過(guò)作者的其他書账阻,很多觀點(diǎn)之前也接觸過(guò),所以讀起來(lái)很快泽本。 書摘: 如果做別人都在做的事淘太,你的...
    煙紫雪閱讀 284評(píng)論 0 1