在正式開(kāi)始講設(shè)計(jì)之前,我們要先討論幾個(gè)問(wèn)題:
- 1 使用哪種交互模式來(lái)跟業(yè)務(wù)層做對(duì)接?
- 2 是否有必要將API返回的數(shù)據(jù)封裝成對(duì)象然后再交付給業(yè)務(wù)層?
- 3 使用集約化調(diào)用方式還是離散型調(diào)用方式去調(diào)用API?
使用哪種交互模式來(lái)跟業(yè)務(wù)層做對(duì)接?
這里其實(shí)有兩個(gè)問(wèn)題:
以什么方式將數(shù)據(jù)交付給業(yè)務(wù)層?
交付什么樣的數(shù)據(jù)給業(yè)務(wù)層?
以什么方式將數(shù)據(jù)交付給業(yè)務(wù)層?
iOS開(kāi)發(fā)領(lǐng)域有很多對(duì)象間數(shù)據(jù)的傳遞方式,我看到的大多數(shù)App在網(wǎng)絡(luò)層所采用的方案主要集中于這三種:Delegate,Notification,Block。KVO和Target-Action我目前還沒(méi)有看到有使用的。
然而在我這邊,我的意見(jiàn)是以Delegate為主,Notification為輔。原因如下:
- 盡可能減少跨層數(shù)據(jù)交流的可能,限制耦合
- 統(tǒng)一回調(diào)方法,便于調(diào)試和維護(hù)
- 在跟業(yè)務(wù)層對(duì)接的部分只采用一種對(duì)接手段(在我這兒就是只采用delegate這一個(gè)手段)限制靈活性,以此來(lái)交換應(yīng)用的可維護(hù)性
盡可能減少跨層數(shù)據(jù)交流的可能,限制耦合
什么叫跨層數(shù)據(jù)交流?就是某一層(或模塊)跟另外的與之沒(méi)有直接對(duì)接關(guān)系的層(或模塊)產(chǎn)生了數(shù)據(jù)交換。為什么這種情況不好?嚴(yán)格來(lái)說(shuō)應(yīng)該是大部分情況都不好,有的時(shí)候跨層數(shù)據(jù)交流確實(shí)也是一種需求。之所以說(shuō)不好的地方在于,它會(huì)導(dǎo)致代碼混亂,破壞模塊的封裝性
。我們?cè)谧龇謱蛹軜?gòu)的目的其中之一就在于下層對(duì)上層有一次抽象,讓上層可以不必關(guān)心下層細(xì)節(jié)而執(zhí)行自己的業(yè)務(wù)。
統(tǒng)一回調(diào)方法,便于調(diào)試和維護(hù)
然后現(xiàn)在談到的這個(gè)情況,就是另一個(gè)采用Block方案不是很合適的情況。首先,Block本身無(wú)好壞對(duì)錯(cuò)之分,只有合適不合適。在這一節(jié)要講的情況里,Block無(wú)法做到回調(diào)方法的統(tǒng)一,調(diào)試和維護(hù)的時(shí)候也很難在調(diào)用棧上顯示出來(lái),找的時(shí)候會(huì)很蛋疼。
在網(wǎng)絡(luò)請(qǐng)求和網(wǎng)絡(luò)層接受請(qǐng)求的地方時(shí),使用Block沒(méi)問(wèn)題。但是在獲得數(shù)據(jù)交給業(yè)務(wù)方時(shí),最好還是通過(guò)Delegate去通知到業(yè)務(wù)方。
所以架構(gòu)師在這邊不要貪圖方便,還是使用delegate的手段吧,業(yè)務(wù)工程師那邊就能不用那么繞了。Block是目前大部分第三方網(wǎng)絡(luò)庫(kù)都采用的方式,因?yàn)樵诎l(fā)送請(qǐng)求的那一部分,使用Block能夠比較簡(jiǎn)潔,因此在請(qǐng)求那一層是沒(méi)有問(wèn)題的,只是在交換數(shù)據(jù)之后,還是轉(zhuǎn)變成delegate比較好,比如AFNetworking里面:
[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.delegate failedWithRequest:request error:error];
}
}];
轉(zhuǎn)載地址:
http://casatwy.com/iosying-yong-jia-gou-tan-wang-luo-ceng-she-ji-fang-an.html