優(yōu)雅快速的搭建iOS工程框架搭建的探討

一個(gè)簡(jiǎn)潔優(yōu)雅的iOS工程目錄,能夠幫助團(tuán)隊(duì)提升開(kāi)發(fā)效率,同時(shí)也令自己進(jìn)行心情愉悅的編碼;反之,雜亂無(wú)章的目錄則會(huì)使人心情煩躁,降低團(tuán)隊(duì)開(kāi)發(fā)效率。

不知你是否也有同感?歡迎你在評(píng)論區(qū)寫(xiě)下的感受。


首先,我想說(shuō):

  • 本文說(shuō)的工程架構(gòu)適用于純代碼開(kāi)發(fā)的團(tuán)隊(duì),也適用于使用Storyboard開(kāi)發(fā)的團(tuán)隊(duì);
  • 本文適用于傳統(tǒng)的Tabbar+NavigationBar搭建的app,也適用于其他非傳統(tǒng)的app;
  • 本文特別適用于讓團(tuán)隊(duì)的新進(jìn)成員了解項(xiàng)目的整體構(gòu)架,并且進(jìn)行快速開(kāi)發(fā)

本文以公司的FCS app為例,界面如下:

主界面

公司的項(xiàng)目屬于Objective-C和Swift混編的項(xiàng)目,對(duì)于純swift的項(xiàng)目和純OC的項(xiàng)目,可能文件夾和類(lèi)文需要自行修改,Xcode項(xiàng)目工程目錄如下:
工程框架搭建圖

正如上圖所示,我將項(xiàng)目劃分為9大部分,GitHub地址

Models:模型數(shù)據(jù)類(lèi),所有自定義的數(shù)據(jù)模型應(yīng)該放在此處;
Views:視圖類(lèi),以功能模塊還需要再建一層文件夾,所有自定義的功能模塊的視圖類(lèi)都應(yīng)該放在給自的文件夾下此處,,手動(dòng)拖入的第三方UI控件除外,第三方的UI應(yīng)該放入Vendor文件夾里;
Controllers:控制器類(lèi),所有控制器類(lèi)放在此文件夾里面,如果有BaseViewController、BaseNavigationController可以放在Base文件夾下(可以在此目錄下新建的一個(gè)Base文件夾),同時(shí)相應(yīng)功能模塊的Storyboard也放在此目錄下,Storyboard放在此處相比于放在View里面更加方便(我們項(xiàng)目最開(kāi)始在Views目錄下新建Storyboards文件夾來(lái)存放所有的Storyboard,這樣的做法弊端是去相應(yīng)的Storyboard和功能模塊的VC太遠(yuǎn),操作不便);
Resouces:資源文件夾,存放項(xiàng)目需要用到的音頻、視頻、圖片(webP格式的圖片或者內(nèi)存比較大png只需要用到一份的背景圖片)、字體、動(dòng)畫(huà)等等資源文件都放在此處;
Util,一些工具類(lèi)的文件夾,比如Objective-C的分類(lèi)文件夾Category、swift擴(kuò)展類(lèi)的文件夾Extension,管理單例類(lèi)文件夾Manager等等;
Vendor,手動(dòng)管理的第三方庫(kù),上圖的BookRoom是我們FCS app的BookRoom模塊都是封裝為framework的形式引入的,所以就適合在此處添加,還有一些比較輕的第三方庫(kù)就可以手動(dòng)拖入代碼添加進(jìn)來(lái),比如我們的項(xiàng)目中有一個(gè)獲取適配型號(hào)的第三方庫(kù)DeviceUtil,對(duì)于這類(lèi)比較輕的庫(kù)盡量使用手動(dòng)拖入代碼管理,畢竟項(xiàng)目中的framework多了,會(huì)影響app的啟動(dòng)時(shí)間,這個(gè)在WWDC 2016 Session 406 - Optimizing App Startup Time的演講中有講原理;
Pods :優(yōu)秀的第三方庫(kù)管理工具,比如網(wǎng)絡(luò)請(qǐng)求AFNetworking,圖片加載SDWebImage等等比較重的第三方庫(kù)就可以使用Pods自動(dòng)管理,當(dāng)然你也可以使用Carthage來(lái)管理,具體使用哪個(gè)見(jiàn)仁見(jiàn)智,網(wǎng)絡(luò)上也有很多關(guān)于這個(gè)的討論。我們公司使用的是Pods,所以就是以Pods為??了;
Appdelegate和首頁(yè):Appdelegate和首頁(yè)是各個(gè)功能模塊的入口,所以放在頂部最顯眼的位置,(對(duì)于傳統(tǒng)Tabbar+NavigationBar App的首頁(yè)類(lèi)文件可能會(huì)在對(duì)應(yīng)的模塊下);
Assets.xcassets、info.plist:這部分相對(duì)Appdelegate在同一目錄下,但是放在最下面,這部分的操作頻率不是太多,Assets.xcassets里面的圖片,可以使用功能模塊放置添加(New Folder,以模塊命名)。

看到這里,有的人會(huì)想:一個(gè)項(xiàng)目直接按照功能模塊劃分不也挺好的么,每個(gè)功能模塊里面再按照MVC的模式劃分,以下面這個(gè)app為例

藝學(xué)機(jī)構(gòu)版

劃分如下所示如下圖所示:
以功能模塊劃分工程框架圖

這兩種搭建項(xiàng)目框架的模式?jīng)]有孰優(yōu)孰劣之分,只有得放到具體情境下面討論才有意義,不過(guò)很明顯,第二種以功能模塊劃分的模式適用于以小團(tuán)隊(duì)開(kāi)發(fā)(iOS端2-3人以下),這樣每個(gè)人負(fù)責(zé)開(kāi)發(fā)一個(gè)模塊,效率非常高。如果團(tuán)隊(duì)人員比較多,則更適合采用第一種模式,這樣開(kāi)發(fā)效率更高,比如有人專(zhuān)門(mén)負(fù)責(zé),網(wǎng)絡(luò)層代碼的編寫(xiě),有人專(zhuān)門(mén)負(fù)責(zé)UI界面的編寫(xiě),有人負(fù)責(zé)日志類(lèi)的封裝編寫(xiě)。

一些其他的小建議:

  1. 文件夾模塊使用英文而不要使用中文命名,并且使用正確的英文名不要使用拼音;
  2. 名稱(chēng)首字母大寫(xiě);
  3. 文件夾層數(shù)不要太多,最多三層;
  4. 快速定位某一個(gè)類(lèi)文件的位置,光標(biāo)在定位在類(lèi)文件里面,按快捷鍵command+shift+J并可定位他的具體位置模塊。

demo的GitHub地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,741評(píng)論 25 709
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,041評(píng)論 4 61
  • 我是一道影子,我怕黑 我怕失去痕跡,失去顏色 我也會(huì)流淚,雖然沒(méi)有聲音 就像我笑起來(lái),所有的人卻以為我快樂(lè) 我咧著...
    Angel烏安閱讀 338評(píng)論 4 3
  • 許多人認(rèn)為晉國(guó)的霸業(yè)成於晉文公重耳,實(shí)則不然。晉公子重耳在外流亡長(zhǎng)達(dá)19年之久,回國(guó)即位時(shí)就已經(jīng)62歲了,早已經(jīng)垂...
    173388a75016閱讀 572評(píng)論 3 3
  • 圓狗子火燒明園(1.不正經(jīng)的大家) 神秘的陸家可以和狗對(duì)話一些小區(qū)里狗子們的日常沒(méi)什么主線劇情——van家豆?jié){。 ...
    van家豆?jié){閱讀 363評(píng)論 0 0

友情鏈接更多精彩內(nèi)容