AFNetworking使用總結

IOS開源網絡庫AFNetworking已經成為了IOS程序開發的首選、亦可以說是必備,無數IOS
的“先哲”們撰文稱贊此庫良好的設計和功能的強大,以致后來的開發者在項目中都不會去
考慮其它的網絡庫,而直接選擇AFNetworking。這里就來總結一下使用它的一般程式,在
總結過程中學習和成長。

HttpClient

我們在使用AFHTTPSessionManager的時候,一般均會對其進行封裝,以滿足App的各種要求。
所以這里選擇對其進行擴展,設計如下:

@interface LNHttpClient : AFHTTPSessionManager

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

@end

該繼承類的實現需要注意如下幾點:

  • 繼承AFHTTPSessionManager免不了對initWithBaseURL的覆寫,并在其中注冊一些通知,用于
    檢測用戶的登陸和登出,以便Client做相應的處理。
  • setHttpHeader可以設置Http頭部,比如token、userId等等。
  • 中間兩個方法使得開發者可以控制每一次請求的timeout和responseType。

APIService

APIService是所有網絡請求的入口,所有Service的網絡調用均使用該類來完成,我們項目中
使用proto-buf來作為數據交換的類型,其設計力求簡介:

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;

該類的設計是對于AFHTTPSessionManager的封裝,是所有Service類的基類。實現要點:

  • 定義了兩個block,分別用來處理成功和失敗的調用。
  • modelClass用來解析ContentType的數據,此處是proto-buf。
  • 此類派生的各個Service來處理不同的業務場景。

AFHTTPRequestSerializer覆寫

在客戶端發送請求時,我們有時需要設置request的content-Type,以便于服務端能夠根據
content-Type來處理不同格式的數據,比如AFNetworking中自帶的AFJSONRequestSerializer,
就能夠把請求的數據轉化為JSON格式,并且把content-Type設置為application/json。這里
我們的請求數據格式為proto-buf,而AF庫并沒有給我們提供相關的默認實現,這時候就需要
我們自己來實現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的主要覆寫方法。同理我們只需要仿照這個例子來
實現AFProtoRequestSerializer即可。

URL緩存

說起HTTP請求,就不得不聊到緩存,每次去請求相同的URL的數據顯然是不劃算的,所以將
每次URL請求的數據緩存起來,以后當有相同的URL請求時,直接使用緩存數據即可。使用
緩存一般有兩種選擇。

  • NSURLCache

    系統提供的默認緩存,使用該方式可以減少開發的難度,但是在使用過程中需要注意的

    • 該緩存只能用在GET請求上,并不支持Post。
    • 緩存方式盡量選擇NSURLRequestReturnCacheDataDontLoad,如果有緩存直接返回數據
      如果沒有緩存則不發送請求,返回nil,我們手工來再發一次請求。這樣做可以規避一
      些蘋果實現緩存的坑。
  • **URLCache

    自己實現的緩存,我們只需要擴展NSURLCache即可,使用擴展的cache來代替原生的實例。
    這樣我們就可以人為控制緩存的URL范圍和數據存儲了,簡單實現如下:

    @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
    

##總結

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

推薦閱讀更多精彩內容

  • 分享類型:游戲開發相關 1 將AFNetWorking文件夾導入項目 2 添加類庫 Security.framew...
    韓七夏閱讀 637評論 0 0
  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,818評論 18 139
  • iOS網絡編程讀書筆記 Facade Tester客戶端門面模式的實例(被動版本化) 被動版本化,所以硬編碼URL...
    melouverrr閱讀 1,619評論 3 7
  • 第一章 Nginx簡介 Nginx是什么 沒有聽過Nginx?那么一定聽過它的“同行”Apache吧!Ngi...
    JokerW閱讀 32,740評論 24 1,002
  • 概述 上一篇主要分析了基于NSURLConnection的AFURLConnectionOperation,本篇主...
    egoCogito_panf閱讀 2,027評論 0 13