iOS開發(fā)-去model化開發(fā)

1.為什么不使用數(shù)據(jù)對象

問題來源:

  • 修改某一領(lǐng)域共享對象或參數(shù)時,可能影響其他領(lǐng)域
  • 解決某一問題愈污,如果引入某個充滿各種不同問題領(lǐng)域的函數(shù)集轮傍,實質(zhì)上也就引入了對不同問題領(lǐng)域解決方案的依賴

2.去model化的手段

a.字典流,即使用原生的數(shù)據(jù)流创夜,通過NSDictionary方式傳遞

b.reformer(本文重點)

  • 問題1:使用哪種交互模式來跟業(yè)務(wù)層做對接?
  • 問題2:是否有必要將API返回的數(shù)據(jù)封裝成對象然后再交付給業(yè)務(wù)層杭跪?
  • 問題3:使用集約化調(diào)用方式還是離散型調(diào)用方式去調(diào)用API?
回答1:使用哪種交互模式來跟業(yè)務(wù)層做對接
1.1 以什么方式將數(shù)據(jù)交付給業(yè)務(wù)層?

大多數(shù)App在網(wǎng)絡(luò)層采用的方式:Delegate涧尿、Notification系奉、Block,建議使用Delegate姑廉,理由如下:

i.盡可能減少跨層數(shù)據(jù)交流的可能缺亮,限制耦合
ii.統(tǒng)一回調(diào),便于調(diào)試和維護(hù)
iii.在跟業(yè)務(wù)層對接的部分只采用一種對接手段庄蹋,限制靈活性瞬内,來交換應(yīng)用的可維護(hù)性

** 什么是跨層數(shù)據(jù)交流? **
--- 就是某一層(或模塊)跟另外的與之沒有直接對接關(guān)系的層(或模塊)產(chǎn)生了數(shù)據(jù)交換限书。

** 為什么這種情況不好虫蝶? **
--- 這會導(dǎo)致代碼混亂,破壞模塊的封裝性倦西。

** 我們做分層架構(gòu)的目的 **
--- 其中之一就在于** 下層對上層有一次抽象能真,讓上層可以不必關(guān)心下層細(xì)節(jié)而執(zhí)行自己的業(yè)務(wù) **。如果下層細(xì)節(jié)被跨層暴露扰柠,一方面你很容易因此失去鄰層對這個暴露細(xì)節(jié)的保護(hù)粉铐;另一方面,你又不可能不去處理這個細(xì)節(jié)卤档,所以處理細(xì)節(jié)的相關(guān)代碼就會散落各地蝙泼,最終難以維護(hù)

** Notification **
--- 使用Notification給跨層數(shù)據(jù)交流開了一道口子,相關(guān)處理的代碼不能保證都在唯一的地方劝枣。不過汤踏,在屬于它的問題領(lǐng)域中,這也是一種非常好的解決方案

** Block **
--- 很難追蹤舔腾,難以維護(hù)溪胶。block會延長相關(guān)對象的生命周期。block在離散型場景下不符合使用的規(guī)范稳诚。

當(dāng)回調(diào)之后要做的任務(wù)在每次回調(diào)時都是一致的情況下哗脖,選擇delegate,在回調(diào)之后要做的任務(wù)在每次回調(diào)時無法保證一致扳还,選擇block才避。在** 離散型調(diào)用的場景 下,每一次回調(diào)都是能夠保證任務(wù)一致的氨距,因此適用delegate桑逝。 蘋果原生的網(wǎng)絡(luò)調(diào)用 采用delegate,因為蘋果是基于離散模型去設(shè)計網(wǎng)絡(luò)調(diào)用的衔蹲。在 集約型調(diào)用的場景 下,使用block是合理的,因為每次請求的類型都不一樣舆驶,那么自然回調(diào)要做的任務(wù)也都會不一樣橱健。 AFNetworking 就是屬于集約型調(diào)用,因此它采用了block來做回調(diào)沙廉。
在網(wǎng)絡(luò)請求和網(wǎng)絡(luò)層接受請求的地方時拘荡,使用Block沒問題撬陵。但是在獲得數(shù)據(jù)交給業(yè)務(wù)方時,最好還是通過Delegate去通知到業(yè)務(wù)方巨税。我們實際編碼時也會意識到盡可能讓
Block的回調(diào)著陸點統(tǒng)一 **,所以選擇在block里面寫個一句話的方法接收參數(shù)草添,然后做轉(zhuǎn)發(fā),然后就可以把這個方法放在其他地方抄淑,這實質(zhì)上跟使用Delegate的手段沒有什么區(qū)別驰后,只是繞了一下,不過還是沒有解決統(tǒng)一回調(diào)方法的問題灶芝,因為block里面寫的方法名字可能在不同的ViewController對象中都會不一樣,所以颤专,建議的寫法如下:

[AFNetworkingAPI callApiWithParam:self.param successed:^(Response *response){
        if ([self.delegate respondsToSelector:@selector(successWithResponse:)]) {
            [self.delegate successedWithResponse:response];
        }
    } failed:^(Request *request, NSError *error){
        if ([self.delegate respondsToSelector:@selector(failedWithResponse:)]) {
            [self failedWithRequest:request error:error];
        }
    }];
1.1小結(jié):以什么方式將數(shù)據(jù)交付給業(yè)務(wù)層钠乏?

盡可能通過Delegate的回調(diào)方式交付數(shù)據(jù),這樣可以避免不必要的跨層訪問簇捍。當(dāng)出現(xiàn)跨層訪問的需求時(比如信號類型切換),通過Notification的方式交付數(shù)據(jù)暑塑。正常情況下應(yīng)該是避免使用Block的

1.2 交付什么樣的數(shù)據(jù)給業(yè)務(wù)層锅必?

大部分的做法是:將拿到的JSON數(shù)據(jù)惕艳,轉(zhuǎn)變成對應(yīng)的對象模型驹愚,這么做有如下成本:

1.數(shù)組內(nèi)容轉(zhuǎn)化成本高
2.存在需要2次轉(zhuǎn)化的數(shù)據(jù)
3.只有API返回的數(shù)據(jù)高度標(biāo)準(zhǔn)化時,生成的Model的可復(fù)用性才高
4.調(diào)試時谁鳍,Model的展示不如NSDictionary/NSArray直觀
5.同一個API的數(shù)據(jù)被不同的View展示劫瞳,難以控制數(shù)據(jù)轉(zhuǎn)化的代碼,有可能散落在多個地方

1.2小結(jié):交付什么樣的數(shù)據(jù)給業(yè)務(wù)層

對于業(yè)務(wù)層而言志于,由Controller根據(jù)View和APIManager之間的關(guān)系,選擇合適的reformer將View可以直接使用的數(shù)據(jù)(甚至reformer可以用來直接生成view)轉(zhuǎn)化好之后交付給View蕊退。對于網(wǎng)絡(luò)層而言憔恳,只需要保持住原始數(shù)據(jù)即可,不需要主動轉(zhuǎn)化成數(shù)據(jù)原型钥组。然后數(shù)據(jù)采用NSDictionary加Const字符串key來表征,避免了使用對象來表征帶來的遷移困難点把,同時不失去可讀性

參考資料:
http://casatwy.com/OOP_nomodel.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末屿附,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子褒翰,更是在濱河造成了極大的恐慌匀泊,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件揣非,死亡現(xiàn)場離奇詭異,居然都是意外死亡早敬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門芯勘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事衡怀。” “怎么了抛杨?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵怖现,是天一觀的道長。 經(jīng)常有香客問我屈嗤,道長,這世上最難降的妖魔是什么饶号? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任茫船,我火速辦了婚禮,結(jié)果婚禮上算谈,老公的妹妹穿的比我還像新娘。我一直安慰自己艾船,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布丽声。 她就那樣靜靜地躺著觉义,像睡著了一般。 火紅的嫁衣襯著肌膚如雪晒骇。 梳的紋絲不亂的頭發(fā)上磺浙,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天撕氧,我揣著相機(jī)與錄音,去河邊找鬼伦泥。 笑死锦溪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的刻诊。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼复局,長吁一口氣:“原來是場噩夢啊……” “哼粟判!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起档礁,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎彤断,沒想到半個月后易迹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡供炼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年窘疮,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闸衫。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡蔚出,死狀恐怖虫腋,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情悦冀,我是刑警寧澤睛琳,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站师骗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜步脓,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望靴患。 院中可真熱鬧,春花似錦农渊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至平挑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間通熄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工廊酣, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人啰扛。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像隐解,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子煞茫,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,870評論 2 361

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