iOS項(xiàng)目搭建目錄

我比較常用的結(jié)構(gòu)

Application:這個(gè)group中放的是AppDelegate和一些系統(tǒng)常量及系統(tǒng)配置文件;

Base:一些基本父類,包括父ViewController和一些公用頂層自定義父類,其他模塊的類一般都繼承自這里的一些類;

Controller:系統(tǒng)控制層,放置ViewController,均繼承于Group Base中的BaseViewController或BaseTableViewController;

View:系統(tǒng)中視圖層,由于我比較喜歡通過代碼實(shí)現(xiàn)界面,所以這里放的都是繼承于UIView的視圖,我將視圖從ViewController中分離出來全部放在這里,這樣能保持ViewController的精簡;

Model:系統(tǒng)中的實(shí)體,通過類來描述系統(tǒng)中的一些角色和業(yè)務(wù),同時(shí)包含對(duì)應(yīng)這些角色和業(yè)務(wù)的處理邏輯;

Handler:系統(tǒng)業(yè)務(wù)邏輯層,負(fù)責(zé)處理系統(tǒng)復(fù)雜業(yè)務(wù)邏輯,上層調(diào)用者是ViewController;

Storage:簡單數(shù)據(jù)存儲(chǔ),主要是一些鍵值對(duì)存儲(chǔ)及系統(tǒng)外部文件的存取,包括對(duì)NSUserDefault和plist存取的封裝;

Network:網(wǎng)絡(luò)處理層(RTHttpClient),封裝了基于AFNetworking的網(wǎng)絡(luò)處理層,通過block實(shí)現(xiàn)處理結(jié)果的回調(diào),上層調(diào)用者是Handler層;

Database:數(shù)據(jù)層,封裝基于FMDB的sqlite數(shù)據(jù)庫存取和管理(RTDatabaseHelper),對(duì)外提供基于Model層對(duì)象的調(diào)用接口,封裝對(duì)數(shù)據(jù)的存儲(chǔ)過程。

Utils:系統(tǒng)工具類(AppUtils),主要放置一些系統(tǒng)常用工具類;

Categories:類別,對(duì)現(xiàn)有系統(tǒng)類和自定義類的擴(kuò)展;

Resource:資源庫,包括圖片,plist文件等;

以上是對(duì)我的工程結(jié)構(gòu)中各個(gè)group的介紹,通過以下登錄模塊的系統(tǒng)類圖,可以比較直觀的看到這種工程結(jié)構(gòu)的全貌。

整體來看分為三大塊,黃色區(qū)域的模型和業(yè)務(wù)邏輯層(M),藍(lán)色區(qū)域的視圖層(V),紅色區(qū)域的視圖控制器層(C),其中,黃色區(qū)域?qū)崿F(xiàn)了對(duì)業(yè)務(wù)邏輯和數(shù)據(jù)處理的封裝,對(duì)應(yīng)他們的上層ViewController,可以實(shí)現(xiàn)非常簡單的接口調(diào)用,將業(yè)務(wù)復(fù)雜性從ViewController中抽離出來,通過模塊化的方式,保證ViewController的可讀性和可維護(hù)性。

保持ViewController簡單

往往大家都會(huì)抱怨iOS中ViewController寫著寫著就會(huì)越來越臃腫,那時(shí)因?yàn)殡S著業(yè)務(wù)的復(fù)雜,功能的增多,所有的邏輯都包含在ViewController中,還包括一些諸如UITableViewDatasource的代理方法,使得ViewController臃腫不堪,可維護(hù)性極低,耦合性也很高,為了使ViewController能更簡單,便于維護(hù)和后續(xù)的開發(fā),給ViewController瘦身就顯得尤為必要,我的做法主要有三個(gè)方面。

1、View視圖與ViewController分離

如果你用Storyboard或者xib這是當(dāng)然的,我比較喜歡手寫代碼,所以不在ViewController里面嵌入過多的View層代碼是保證ViewController簡單的方法之一,那么,可以將View部分的代碼單獨(dú)封裝到一個(gè)繼承自UIView的子類當(dāng)中,然后通過自定義Delegate實(shí)現(xiàn)View與ViewController的通信。

2、業(yè)務(wù)邏輯與ViewController分離

將網(wǎng)絡(luò)請(qǐng)求處理和復(fù)雜的業(yè)務(wù)邏輯以及數(shù)據(jù)的存取工作單獨(dú)放到Handler層,對(duì)ViewController只暴露簡單的調(diào)用接口和通過block或delegate實(shí)現(xiàn)的回調(diào),這樣不僅能使我們的工程模塊化,也能大大降低ViewController的復(fù)雜性,就不會(huì)出現(xiàn)既包括網(wǎng)絡(luò)處理又包括數(shù)據(jù)處理的冗長的ViewController代碼了。Handler通過block或delegate將處理完的結(jié)果回調(diào)給ViewController,ViewController再將結(jié)果與View視圖層相關(guān)聯(lián)處理,這樣就真正起到了MVC的作用,整體原則就是,讓ViewController只關(guān)系和負(fù)責(zé)處理與它相關(guān)的事。

在BaseHandler.h中可以定義一些簡單的業(yè)務(wù)處理規(guī)則:

#import?

/**??*??Handler處理完成后調(diào)用的Block

*/?typedef?void?(^CompleteBlock)();

/**

*??Handler處理成功時(shí)調(diào)用的Block??*/

typedef?void?(^SuccessBlock)(id?obj);

/**??*??Handler處理失敗時(shí)調(diào)用的Block

*/?typedef?void?(^FailedBlock)(id?obj);

@interface?BaseHandler?:?NSObject

/**

*??獲取請(qǐng)求URL??*

*??@param?path??*??@return?拼裝好的URL

*/?+?(NSString?*)requestUrlWithPath:(NSString?*)path;

@end

在LoginHandler中就可以定義對(duì)LoginViewController暴露的調(diào)用接口,在LoginHandler中封裝負(fù)責(zé)的網(wǎng)絡(luò)處理和業(yè)務(wù)處理邏輯,對(duì)LoginViewcontroller來說,只需要調(diào)用這個(gè)方法并傳入對(duì)應(yīng)的UserEntity實(shí)體對(duì)象和處理成功和失敗狀態(tài)下的回調(diào)block就可以了。

#import?"BaseHandler.h"?#import?"UserEntity.h"

@interface?LoginHandler?:?BaseHandler

/**

*??用戶登錄業(yè)務(wù)邏輯處理??*

*??@param?user??*??@param?success

*??@param?failed????*/

-?(void)executeLoginTaskWithUser:(UserEntity?*)user?success:(SuccessBlock)success?failed:(FailedBlock)failed;

@end

3、Datasource或Delegate與ViewController分離

在iOS開發(fā)中經(jīng)常用到的UITableView包含了一系列的代理方法,這些方法往往也是使得ViewController變長變復(fù)雜的元兇之一,那么,將這些Datasource或Delegate分離出來也是行之有效的方法之一,例如,通過自定義Datasource類(實(shí)現(xiàn)UITableViewDatasource協(xié)議)來將跟UITableView相關(guān)的數(shù)據(jù)源處理代理方法都集中到一個(gè)特定的類當(dāng)中,ViewController只需要設(shè)置這個(gè)自定義數(shù)據(jù)源類給UITableView,然后其他的就都可以交給自定義數(shù)據(jù)源類去處理了。

我參考了Lighter View Controllers上的介紹改進(jìn)了一個(gè)BaseTableViewProtocol,基本上常用的一些場(chǎng)景是可以使用的,不過這個(gè)還得不斷優(yōu)化以適應(yīng)更多的場(chǎng)景,具體的代碼我放在Github上了,感興趣的同學(xué)可以去看看,使用方法可以參考上面鏈接中的介紹,基本類似,我的改進(jìn)主要是支持對(duì)多section的適用。

BaseTableViewProtocol.h

BaseTableViewProtocol.m

寫在最后

以上是我在開發(fā)iOS項(xiàng)目中的一些總結(jié)和工程實(shí)踐,其中肯定還是存在很多問題的,我也在不斷尋求改進(jìn)的方法,也歡迎各路高手給我提出意見和建議。關(guān)于這個(gè)工程結(jié)構(gòu)的一個(gè)簡單事例我放在我的Github上了,感興趣的同學(xué)可以去看看RTLibrary-ios。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,106評(píng)論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,441評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,211評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,736評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,475評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,834評(píng)論 1 328
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,829評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,009評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,559評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,516評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,038評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,728評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,132評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,443評(píng)論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,249評(píng)論 3 399
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,484評(píng)論 2 379

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

  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中。。。 其實(shí)如果沒有APIManager這一層是沒法使用delegate的,畢竟多個(gè)單...
    yhtang閱讀 5,233評(píng)論 1 23
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,728評(píng)論 25 708
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,197評(píng)論 30 471
  • 轉(zhuǎn)載:Ryan's Zone 好的架構(gòu)不是設(shè)計(jì)出來的,而是進(jìn)化而來的! 寫在前面 從2011年底開始學(xué)習(xí)iOS開發(fā)...
    喜歡就可以閱讀 718評(píng)論 0 3
  • 他是一家上市公司的老總,腰纏萬貫。 有一天,他突發(fā)奇想,想體驗(yàn)一下普通百姓的生活。 他上了公共汽車,投了幣,找到一...
    7eabed3c50ea閱讀 416評(píng)論 0 1