AFNetworking使用總結(jié)

IOS開源網(wǎng)絡(luò)庫AFNetworking已經(jīng)成為了IOS程序開發(fā)的首選官还、亦可以說是必備堕虹,無數(shù)IOS
的“先哲”們撰文稱贊此庫良好的設(shè)計(jì)和功能的強(qiáng)大鬼雀,以致后來的開發(fā)者在項(xiàng)目中都不會去
考慮其它的網(wǎng)絡(luò)庫实撒,而直接選擇AFNetworking靴患。這里就來總結(jié)一下使用它的一般程式桨菜,在
總結(jié)過程中學(xué)習(xí)和成長豁状。

HttpClient

我們在使用AFHTTPSessionManager的時候,一般均會對其進(jìn)行封裝倒得,以滿足App的各種要求泻红。
所以這里選擇對其進(jìn)行擴(kuò)展,設(shè)計(jì)如下:

@interface LNHttpClient : AFHTTPSessionManager

+ (instancetype)sharedClient;
+ (void)setTimeout:(NSTimeInterval)timeout;
+ (void)setResponseType:(LNHttpResponseType)type;
- (void)setHttpHeader;

@end

該繼承類的實(shí)現(xiàn)需要注意如下幾點(diǎn):

  • 繼承AFHTTPSessionManager免不了對initWithBaseURL的覆寫霞掺,并在其中注冊一些通知谊路,用于
    檢測用戶的登陸和登出,以便Client做相應(yīng)的處理菩彬。
  • setHttpHeader可以設(shè)置Http頭部缠劝,比如token潮梯、userId等等。
  • 中間兩個方法使得開發(fā)者可以控制每一次請求的timeout和responseType惨恭。

APIService

APIService是所有網(wǎng)絡(luò)請求的入口酷麦,所有Service的網(wǎng)絡(luò)調(diào)用均使用該類來完成,我們項(xiàng)目中
使用proto-buf來作為數(shù)據(jù)交換的類型喉恋,其設(shè)計(jì)力求簡介:

typedef void (^APISuccessHandler)(id responseObject);
typedef void (^APIFailureHandler)(NSInteger code, NSString *msg);

@interface APIService : NSObject


+ (NSURLSessionTask *)POST:(NSString *)relativePath
             protobuf:(NSData *)proto
           modelClass:(Class)modelClass
              success:(APISuccessHandler)success
              failure:(APIFailureHandler)failure;


+ (NSURLSessionTask *)GET:(NSString *)relativePath
             protobuf:(NSData *)proto
           modelClass:(Class)modelClass
              success:(APISuccessHandler)success
              failure:(APIFailureHandler)failure;

該類的設(shè)計(jì)是對于AFHTTPSessionManager的封裝沃饶,是所有Service類的基類。實(shí)現(xiàn)要點(diǎn):

  • 定義了兩個block轻黑,分別用來處理成功和失敗的調(diào)用糊肤。
  • modelClass用來解析ContentType的數(shù)據(jù),此處是proto-buf氓鄙。
  • 此類派生的各個Service來處理不同的業(yè)務(wù)場景馆揉。

AFHTTPRequestSerializer覆寫

在客戶端發(fā)送請求時,我們有時需要設(shè)置request的content-Type抖拦,以便于服務(wù)端能夠根據(jù)
content-Type來處理不同格式的數(shù)據(jù)升酣,比如AFNetworking中自帶的AFJSONRequestSerializer,
就能夠把請求的數(shù)據(jù)轉(zhuǎn)化為JSON格式,并且把content-Type設(shè)置為application/json态罪。這里
我們的請求數(shù)據(jù)格式為proto-buf噩茄,而AF庫并沒有給我們提供相關(guān)的默認(rèn)實(shí)現(xiàn),這時候就需要
我們自己來實(shí)現(xiàn)AFProtoRequestSerializer复颈。

- (NSURLRequest *)requestBySerializingRequest:(NSURLRequest *)request
                           withParameters:(id)parameters
                                    error:(NSError *__autoreleasing *)error
{
NSParameterAssert(request);

if ([self.HTTPMethodsEncodingParametersInURI containsObject:[[request HTTPMethod] uppercaseString]]) {
    return [super requestBySerializingRequest:request withParameters:parameters error:error];
}

NSMutableURLRequest *mutableRequest = [request mutableCopy];

[self.HTTPRequestHeaders enumerateKeysAndObjectsUsingBlock:^(id field, id value, BOOL * __unused stop) {
    if (![request valueForHTTPHeaderField:field]) {
        [mutableRequest setValue:value forHTTPHeaderField:field];
    }
}];

if (parameters) {
    if (![mutableRequest valueForHTTPHeaderField:@"Content-Type"]) {
        [mutableRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
    }

    [mutableRequest setHTTPBody:[NSJSONSerialization dataWithJSONObject:parameters options:self.writingOptions error:error]];
}

return mutableRequest;
}

上面的代碼是AFJSONRequestSerializer的主要覆寫方法绩聘。同理我們只需要仿照這個例子來
實(shí)現(xiàn)AFProtoRequestSerializer即可。

URL緩存

說起HTTP請求耗啦,就不得不聊到緩存凿菩,每次去請求相同的URL的數(shù)據(jù)顯然是不劃算的,所以將
每次URL請求的數(shù)據(jù)緩存起來帜讲,以后當(dāng)有相同的URL請求時衅谷,直接使用緩存數(shù)據(jù)即可。使用
緩存一般有兩種選擇似将。

  • NSURLCache

    系統(tǒng)提供的默認(rèn)緩存获黔,使用該方式可以減少開發(fā)的難度,但是在使用過程中需要注意的

    • 該緩存只能用在GET請求上玩郊,并不支持Post肢执。
    • 緩存方式盡量選擇NSURLRequestReturnCacheDataDontLoad,如果有緩存直接返回?cái)?shù)據(jù)
      如果沒有緩存則不發(fā)送請求译红,返回nil预茄,我們手工來再發(fā)一次請求。這樣做可以規(guī)避一
      些蘋果實(shí)現(xiàn)緩存的坑。
  • **URLCache

    自己實(shí)現(xiàn)的緩存耻陕,我們只需要擴(kuò)展NSURLCache即可拙徽,使用擴(kuò)展的cache來代替原生的實(shí)例。
    這樣我們就可以人為控制緩存的URL范圍和數(shù)據(jù)存儲了诗宣,簡單實(shí)現(xiàn)如下:

    @implementation LNURLCache
    
    - (void)storeCachedResponse:(NSCachedURLResponse *)cachedResponse forRequest:(NSURLRequest *)request {
        if ([self shouldManuallyCacheRequest:request]) {
            [[LNCache globalCache] setObject:cachedResponse forKey:request.URL.absoluteString withTimeoutInterval:kTimeOneYear];
        } else {
            [super storeCachedResponse:cachedResponse forRequest:request];
        }
    }
    
    - (NSCachedURLResponse *)cachedResponseForRequest:(NSURLRequest *)request {
        if ([self shouldManuallyCacheRequest:request]) {
            return (NSCachedURLResponse *)[[LNCache globalCache] objectForKey:request.URL.absoluteString];
        } else {
            return [super cachedResponseForRequest:request];
        }
    }
    
    - (BOOL)shouldManuallyCacheRequest:(NSURLRequest *)request {
        return [request.URL.host hasSuffix:kCDNHostName];
    }
    
    @end
    

##總結(jié)

通過以上講解膘怕,相信你可以從容地處理好網(wǎng)絡(luò)請求模塊的設(shè)計(jì)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末召庞,一起剝皮案震驚了整個濱河市岛心,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌篮灼,老刑警劉巖忘古,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诅诱,居然都是意外死亡髓堪,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進(jìn)店門娘荡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來干旁,“玉大人,你說我怎么就攤上這事炮沐≌海” “怎么了?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵央拖,是天一觀的道長祭阀。 經(jīng)常有香客問我,道長鲜戒,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任抹凳,我火速辦了婚禮遏餐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘赢底。我一直安慰自己失都,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布幸冻。 她就那樣靜靜地躺著粹庞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪洽损。 梳的紋絲不亂的頭發(fā)上庞溜,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機(jī)與錄音碑定,去河邊找鬼流码。 笑死又官,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的漫试。 我是一名探鬼主播六敬,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼驾荣!你這毒婦竟也來了外构?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤播掷,失蹤者是張志新(化名)和其女友劉穎典勇,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體叮趴,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡割笙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了眯亦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伤溉。...
    茶點(diǎn)故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖妻率,靈堂內(nèi)的尸體忽然破棺而出乱顾,到底是詐尸還是另有隱情,我是刑警寧澤宫静,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布走净,位于F島的核電站,受9級特大地震影響孤里,放射性物質(zhì)發(fā)生泄漏伏伯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一捌袜、第九天 我趴在偏房一處隱蔽的房頂上張望说搅。 院中可真熱鬧,春花似錦虏等、人聲如沸弄唧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽候引。三九已至,卻和暖如春敦跌,著一層夾襖步出監(jiān)牢的瞬間澄干,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留傻寂,地道東北人息尺。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像疾掰,于是被迫代替她去往敵國和親搂誉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評論 2 354

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

  • 分享類型:游戲開發(fā)相關(guān) 1 將AFNetWorking文件夾導(dǎo)入項(xiàng)目 2 添加類庫 Security.framew...
    韓七夏閱讀 628評論 0 0
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理静檬,服務(wù)發(fā)現(xiàn)炭懊,斷路器,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • iOS網(wǎng)絡(luò)編程讀書筆記 Facade Tester客戶端門面模式的實(shí)例(被動版本化) 被動版本化拂檩,所以硬編碼URL...
    melouverrr閱讀 1,606評論 3 7
  • 第一章 Nginx簡介 Nginx是什么 沒有聽過Nginx侮腹?那么一定聽過它的“同行”Apache吧!Ngi...
    JokerW閱讀 32,674評論 24 1,002
  • 概述 上一篇主要分析了基于NSURLConnection的AFURLConnectionOperation稻励,本篇主...
    egoCogito_panf閱讀 2,004評論 0 13