国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

iOS客戶(hù)端網(wǎng)絡(luò)框架設(shè)計(jì)(一)

kelvinlee / 2401人閱讀

摘要:我們的客戶(hù)端網(wǎng)絡(luò)框架至少要解決三個(gè)問(wèn)題實(shí)現(xiàn)通信協(xié)議賬戶(hù)系統(tǒng)簡(jiǎn)化服務(wù)端接口調(diào)用。賬戶(hù)系統(tǒng)簡(jiǎn)而言之就是實(shí)現(xiàn)注冊(cè)登陸注銷(xiāo)等功能,并維護(hù)登陸狀態(tài)等。這樣客戶(hù)代碼就可以通過(guò)這一單一接口使用網(wǎng)絡(luò)框架了。

我們的客戶(hù)端網(wǎng)絡(luò)框架至少要解決三個(gè)問(wèn)題:實(shí)現(xiàn)通信協(xié)議、賬戶(hù)系統(tǒng)、簡(jiǎn)化服務(wù)端接口調(diào)用。

實(shí)現(xiàn)通信協(xié)議 根據(jù)與服務(wù)端制定的通信協(xié)議,實(shí)現(xiàn)請(qǐng)求的組裝,序列化,發(fā)送,以及響應(yīng)的接收和解析等。
賬戶(hù)系統(tǒng) 簡(jiǎn)而言之就是實(shí)現(xiàn)注冊(cè)、登陸、注銷(xiāo)等功能,并維護(hù)登陸狀態(tài)等。
簡(jiǎn)化服務(wù)端接口調(diào)用 客戶(hù)代碼只需要提供業(yè)務(wù)參數(shù)和回調(diào)函數(shù)就可以實(shí)現(xiàn)與服務(wù)器通信,網(wǎng)絡(luò)框架負(fù)責(zé)封裝掉其余所有細(xì)節(jié)。

我想對(duì)架構(gòu)比較敏感的讀者會(huì)立刻有這樣的共鳴,首先上述的賬戶(hù)系統(tǒng)顯然是一個(gè)獨(dú)立的模塊,最好多帶帶設(shè)計(jì)實(shí)現(xiàn)。另一方面,賬戶(hù)系統(tǒng)的功能又是以服務(wù)端接口調(diào)用為基礎(chǔ)的,在形式上登陸操作也是調(diào)用服務(wù)端接口,那么把登陸相關(guān)操作與其他服務(wù)端接口調(diào)用實(shí)現(xiàn)于一處就是自然的。如果再作一些考慮,我們還會(huì)想到的一個(gè)問(wèn)題是,網(wǎng)絡(luò)框架暴露給客戶(hù)代碼的接口應(yīng)當(dāng)盡可能單一,如果我們用一個(gè)類(lèi)維護(hù)賬戶(hù)系統(tǒng),用另一個(gè)類(lèi)做服務(wù)端業(yè)務(wù)接口調(diào)用,會(huì)嫌不夠簡(jiǎn)潔。達(dá)成這幾點(diǎn)共識(shí)之后,我們就可以繼續(xù)探討一些設(shè)計(jì)細(xì)節(jié)了。先看下面的代碼。

//SFClient.h
@interface SFClient

@property (nonatomic,readonly) NSString* account;
@property (nonatomic,readonly) NSString* password;
@property (nonatomic,readonly) BOOL isLoggedIn;
@property (nonatomic,readonly) BOOL pendingLogin;
@property (nonatomic,readonly) NSString* sessionId;

-(NSURLSessionTask*)loginWithAccount:(NSString*)account password:(NSString*)password;

-(NSURLSessionTask*)logout;

-(NSURLSessionTask*)someNetworkingTaskWithCompletionHandler:(SFNetworkingTaskCompletionHandler)completionHandler;

//...

@end
有的同行習(xí)慣于為每一個(gè)后端接口多帶帶開(kāi)一個(gè)類(lèi),這當(dāng)然也不失為一種設(shè)計(jì)風(fēng)格,筆者也曾嘗試過(guò),個(gè)人感覺(jué)嫌繁。

這里的SFClient類(lèi)作為賬戶(hù)系統(tǒng),又兼具服務(wù)端業(yè)務(wù)接口調(diào)用功能,實(shí)現(xiàn)了使接口盡可能簡(jiǎn)潔的設(shè)計(jì)目標(biāo),卻違背了賬戶(hù)系統(tǒng)應(yīng)當(dāng)多帶帶實(shí)現(xiàn)的架構(gòu)設(shè)計(jì)直覺(jué)。
如何解決這一矛盾呢?可以采用dynamic proxy設(shè)計(jì)模式。

定義一個(gè)protocol假設(shè)叫SFBackendInterfaces,和一個(gè)實(shí)現(xiàn)類(lèi)假設(shè)叫SFBackendInterfacesImpl。讓SFClientSFBackendInterfacesImpl都實(shí)現(xiàn)這個(gè)協(xié)議。

@protocol SFBackendInterfaces

-(NSURLSessionTask*)loginWithAccount:(NSString*)account password:(NSString*)password completionHandler:(SFNetworkingTaskCompletionHandler);

-(NSURLSessionTask*)someNetworkingTaskWithCompletionHandler:(SFNetworkingTaskCompletionHandler)completionHandler;

@end

@interface SFClient:NSObject

@interface SFBackendInterfacesImpl:NSObject

這樣做的目的是什么呢,就是讓SFClient類(lèi)繼續(xù)提供服務(wù)端接口調(diào)用功能,同時(shí)把這些接口調(diào)用的實(shí)現(xiàn)代碼交給SFBackendInterfacesImpl。這樣就既滿(mǎn)足網(wǎng)絡(luò)框架接口簡(jiǎn)潔的需求,又保持了SFClient類(lèi)作為賬戶(hù)系統(tǒng)的純凈,-(NSURLSessionTask*)someNetworkingTaskWithCompletionHandler:(SFNetworkingTaskCompletionHandler)completionHandler;這行代碼可以從SFClient的interface中拿掉了,并且相關(guān)代碼也不需要出現(xiàn)在它的implementation文件里了。我們來(lái)看implementation。

@implementation SFClient

-(void)forwardInvocation:(NSInvocation *)anInvocation
{
    if([self.backendInterfacesImpl respondsToSelector:anInvocation.selector]){
        [anInvocation invokeWithTarget:self.backendInterfacesImpl];
    }else{
        [super forwardInvocation:anInvocation];
    }
}

-(void)loginWithAccount:(NSString*)account password:(NSString*)password
{
    NSURLSessionTask* task=[self loginWithAccount:account password:(NSString*)password completionHandler:^(SFResponse* response){
        [[NSNotificationCenter defaultCenter] postNotificationNamed:SFLoginCompletionNotification object:response];
        _pendingLogin=NO;
        if(response.status==SFResponseStatusSuccess){
            _loggedIn=YES;
        }
    }];
    [task resume];
    _pendingLogin=YES;
}

@end

@implementation SFBackendInterfacesImpl

-(NSURLSessionTask*)loginWithAccount:(NSString*)account password:(NSString*)password completionHandler:(SFNetworkingTaskCompletionHandler)
{
    //...
}

-(NSURLSessionTask*)someNetworkingTaskWithCompletionHandler:(SFNetworkingTaskCompletionHandler)completionHandler
{
    //...
}

@end

這樣客戶(hù)代碼就可以通過(guò)SFClient這一單一接口使用網(wǎng)絡(luò)框架了。

[[SFClient sharedClient] loginWithAccount:xxxx password:xxxx];
//...
NSURLSessionTask* task=[[SFClient sharedClient] someNetworkingTaskWithPara::param completionHandler:^(SFResponse* response){
    //...
}];
[task resume];

而在框架內(nèi)部實(shí)現(xiàn)上,賬戶(hù)系統(tǒng)和業(yè)務(wù)接口調(diào)用的實(shí)現(xiàn)仍然是分離的。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/11728.html

相關(guān)文章

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<