作者: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搏存。