AF學(xué)習筆記一

1伴逸、AFHTTPRequestOperationManager的封裝了與web應(yīng)用程序通過HTTP通信的常見模式,包括創(chuàng)建請求,響應(yīng)序列化,網(wǎng)絡(luò)可達性監(jiān)控缠沈、運營管理和安全,以及請求。
2、針對ios7或Mac OS X 10.9或更高版本的開發(fā)人員洲愤,推薦使用其子類“AFHTTPSessionManager”進行web服務(wù)颓芭,AFHTTPSessionManager提供了一個類方法,這個類方法方法返回一個共享的單例對象柬赐,在該對象上可以通過應(yīng)用程序共享身份驗證和其他配置亡问。
3、想要改變AFHTTPRequestOperationManager及其子類的所有請求操作的結(jié)構(gòu)肛宋,那么就需要重載方法HTTPRequestOperationWithRequest:success:failure州藕。
4、由HTTP客戶端所創(chuàng)建的請求會包括請求頭和根據(jù)requestSerializer屬性加密后的參數(shù)酝陈,這個請求符合AFURLRequestSerialization規(guī)范床玻。
5、收到的返回結(jié)果會符合AFURLResponseSerialization規(guī)范后添,這個結(jié)果會被服務(wù)器端自動驗證并且被responseSerializers序列化笨枯。
6薪丁、
對于HTTP方便的方法來說遇西,請求序列化從相對路徑(the path relative)和基本路徑(-baseURL)兩個屬性去構(gòu)造URLs,構(gòu)造URLs用的就是方法NSURL +URLWithString:relativeToURL:,前提是這兩個屬性都被提供的情況。如果baseURL是空严嗜,構(gòu)造URLs就需要使用NSURL +URLWithString:方法去獲得一個有效的URL粱檀。
以下就是怎樣使用baseURL和relative paths合成URL的方法:

    NSURL *baseURL = [NSURL URLWithString:@"http://example.com/v1/"];
    [NSURL URLWithString:@"foo" relativeToURL:baseURL];                  // http://example.com/v1/foo
    [NSURL URLWithString:@"foo?bar=baz" relativeToURL:baseURL];          // http://example.com/v1/foo?bar=baz
    [NSURL URLWithString:@"/foo" relativeToURL:baseURL];                 // http://example.com/foo
    [NSURL URLWithString:@"foo/" relativeToURL:baseURL];                 // http://example.com/v1/foo
    [NSURL URLWithString:@"/foo/" relativeToURL:baseURL];                // http://example.com/foo/
    [NSURL URLWithString:@"http://example2.com/" relativeToURL:baseURL]; // http://example2.com/

7、通過“reachabilityManager”屬性可獲得網(wǎng)絡(luò)可達性狀態(tài)和變更監(jiān)控漫玄。應(yīng)用程序可以選擇監(jiān)視網(wǎng)絡(luò)可達性條件茄蚯,以防止或中止任何出站請求。
8睦优、“AFHTTPRequestOperationManager”符合“NSSecureCoding”和“NSCopying”協(xié)議,允許Operation歸檔到磁盤,分別存檔和復(fù)制在內(nèi)存中渗常。不過,有幾個小問題需要謹記:

  • HTTP客戶端的存檔和副本將使用空操作隊列初始化汗盘。
  • NSSecureCoding不能序列化/反序列化block屬性皱碘,因此HTTP客戶端的存檔將不包括可能設(shè)置的任何可達性block屬性。
    9隐孽、
/**
 The dispatch queue for the `completionBlock` of request operations. If `NULL` (default), the main queue is used.
 */
//默認回調(diào)主線程
@property (nonatomic, strong) dispatch_queue_t completionQueue;

/**
 The dispatch group for the `completionBlock` of request operations. If `NULL` (default), a private dispatch group is used.
 */
//默認開啟一個私有g(shù)roup
@property (nonatomic, strong) dispatch_group_t completionGroup;

首先癌椿,看一個普通的GET請求:

- (AFHTTPRequestOperation *)GET:(NSString *)URLString
                     parameters:(id)parameters
                        success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
                        failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
{
    NSMutableURLRequest *request = [self.requestSerializer requestWithMethod:@"GET" URLString:[[NSURL URLWithString:URLString relativeToURL:self.baseURL] absoluteString] parameters:parameters error:nil];
    AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure];

    //操作隊列加入請求操作
    [self.operationQueue addOperation:operation];

    return operation;
}

//AFHTTPRequestSerializerObservedKeyPaths???

static NSArray * AFHTTPRequestSerializerObservedKeyPaths() {
    static NSArray *_AFHTTPRequestSerializerObservedKeyPaths = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        _AFHTTPRequestSerializerObservedKeyPaths = @[NSStringFromSelector(@selector(allowsCellularAccess)), NSStringFromSelector(@selector(cachePolicy)), NSStringFromSelector(@selector(HTTPShouldHandleCookies)), NSStringFromSelector(@selector(HTTPShouldUsePipelining)), NSStringFromSelector(@selector(networkServiceType)), NSStringFromSelector(@selector(timeoutInterval))];
    });

    return _AFHTTPRequestSerializerObservedKeyPaths;
}

原來它是一個方法的字符串數(shù)組。再這里菱阵,需要看一下類AFURLRequestSerialization踢俄。
“AFHTTPRequestSerializer”符合“AFURLRequestSerialization”&“AFURLResponseSerialization”協(xié)議,兩者提供了URL的查詢字符串/表單編碼的參數(shù)序列化和默認請求頭,以及響應(yīng)狀態(tài)代碼和內(nèi)容類型驗證的一個具體的基本實現(xiàn)方法晴及。這個類包含了一些屬性都办,這些屬性就是上面提到的字符串數(shù)組:

/**
 The string encoding used to serialize parameters. `NSUTF8StringEncoding` by default.
 */
@property (nonatomic, assign) NSStringEncoding stringEncoding;

/**
 Whether created requests can use the device’s cellular radio (if present). `YES` by default.
 
 @see NSMutableURLRequest -setAllowsCellularAccess:
 */
@property (nonatomic, assign) BOOL allowsCellularAccess;

/**
 The cache policy of created requests. `NSURLRequestUseProtocolCachePolicy` by default.
 
 @see NSMutableURLRequest -setCachePolicy:
 */
@property (nonatomic, assign) NSURLRequestCachePolicy cachePolicy;

/**
 Whether created requests should use the default cookie handling. `YES` by default.
 
 @see NSMutableURLRequest -setHTTPShouldHandleCookies:
 */
@property (nonatomic, assign) BOOL HTTPShouldHandleCookies;

/**
 Whether created requests can continue transmitting data before receiving a response from an earlier transmission. `NO` by default
 
 @see NSMutableURLRequest -setHTTPShouldUsePipelining:
 */
@property (nonatomic, assign) BOOL HTTPShouldUsePipelining;

然后,在AFHTTPRequestSerializer類里,封裝了Request請求如下:

- (NSMutableURLRequest *)requestWithMethod:(NSString *)method
                                 URLString:(NSString *)URLString
                                parameters:(id)parameters
                                     error:(NSError *__autoreleasing *)error
{
    NSParameterAssert(method);
    NSParameterAssert(URLString);

    NSURL *url = [NSURL URLWithString:URLString];

    NSParameterAssert(url);

    NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc] initWithURL:url];
    mutableRequest.HTTPMethod = method;

    //目的是觀察看是否有RequestSerialization屬性值的改變琳钉。
    //為什么要寫成字符串數(shù)組的格式世舰?
    for (NSString *keyPath in AFHTTPRequestSerializerObservedKeyPaths()) {
        if ([self.mutableObservedChangedKeyPaths containsObject:keyPath]) {
            [mutableRequest setValue:[self valueForKeyPath:keyPath] forKey:keyPath];
        }
    }

    mutableRequest = [[self requestBySerializingRequest:mutableRequest withParameters:parameters error:error] mutableCopy];

    return mutableRequest;
}

到這里,發(fā)現(xiàn)要形成一個AFHTTPRequestOperation對象槽卫,就是封裝NSMutableURLRequest的同時跟压,再加上添加一個請求參數(shù)的序列化類(AFHTTPRequestSerializer)以及對該類的屬性值做一些設(shè)置以滿足AFRequestOperation更好的更多的功能和用戶體驗。
在這里歼培,每一個mutableRequest都會設(shè)置一個緩存策略震蒋,且有一個默認值, NSURLRequestUseProtocolCachePolicy。
可是躲庄,我有一個疑問:AFHTTPRequestOperationManager為什么要使用NSCopying協(xié)議(對象拷貝協(xié)議)呢查剖?

關(guān)于網(wǎng)絡(luò)請求的知識,我收集了一些佳作:
http://blog.csdn.net/lcg910978041/article/details/51484817

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末噪窘,一起剝皮案震驚了整個濱河市笋庄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌倔监,老刑警劉巖直砂,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異浩习,居然都是意外死亡静暂,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門谱秽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來洽蛀,“玉大人,你說我怎么就攤上這事疟赊〗脊” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵近哟,是天一觀的道長驮审。 經(jīng)常有香客問我,道長椅挣,這世上最難降的妖魔是什么头岔? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮鼠证,結(jié)果婚禮上峡竣,老公的妹妹穿的比我還像新娘。我一直安慰自己量九,他們只是感情好适掰,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布颂碧。 她就那樣靜靜地躺著,像睡著了一般类浪。 火紅的嫁衣襯著肌膚如雪载城。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天费就,我揣著相機與錄音诉瓦,去河邊找鬼。 笑死力细,一個胖子當著我的面吹牛睬澡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播眠蚂,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼煞聪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了逝慧?” 一聲冷哼從身側(cè)響起昔脯,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎笛臣,沒想到半個月后云稚,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡捐祠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年碱鳞,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片踱蛀。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖贵白,靈堂內(nèi)的尸體忽然破棺而出率拒,到底是詐尸還是另有隱情,我是刑警寧澤禁荒,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布猬膨,位于F島的核電站,受9級特大地震影響呛伴,放射性物質(zhì)發(fā)生泄漏勃痴。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一热康、第九天 我趴在偏房一處隱蔽的房頂上張望沛申。 院中可真熱鬧,春花似錦姐军、人聲如沸铁材。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽著觉。三九已至村生,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間饼丘,已是汗流浹背趁桃。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肄鸽,地道東北人镇辉。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像贴捡,于是被迫代替她去往敵國和親忽肛。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理烂斋,服務(wù)發(fā)現(xiàn)屹逛,斷路器,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • 同步請求和異步請求- 同步請求:阻塞式請求汛骂,會導(dǎo)致用戶體驗的中斷- 異步請求:非阻塞式請求罕模,不中斷用戶體驗,百度地...
    WangDavid閱讀 589評論 0 0
  • 繼承:AFURLSessionManager:NSObject 遵照:NSCopying, NSSecureCod...
    _阿南_閱讀 6,710評論 0 3
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,811評論 6 342
  • AFHTTPRequestOperationManager 網(wǎng)絡(luò)傳輸協(xié)議UDP帘瞭、TCP淑掌、Http、Socket蝶念、X...
    Carden閱讀 4,338評論 0 12