這個方法就是AFHTTPSessionManager 中構建NSMutableRequest的方法,分三步進行講解。
第一步
1.經過URLString 構建NSURL
2.經過NSURL構建NSMutableURLRequest,並設置HTTPMethod
第二步
AFHTTPRequestSerializerObservedKeyPaths()
使用static 修飾符,表示該方法只能在本文件中使用
總體使用了單例模式,當值改變時,總體都會有所改變。
簡單介紹一下各個屬性的做用:
/**
是否容許使用設備的蜂窩移動網絡來建立request,默認爲容許:
*/
@property (nonatomic, assign) BOOL allowsCellularAccess;
/**
建立的request所使用的緩存策略,默認使用`NSURLRequestUseProtocolCachePolicy`,該策略表示
若是緩存不存在,直接從服務端獲取。若是緩存存在,會根據response中的Cache-Control字段判斷
下一步操做,如: Cache-Control字段爲must-revalidata, 則 詢問服務端該數據是否有更新,無更新話
直接返回給用戶緩存數據,若已更新,則請求服務端.
*/
@property (nonatomic, assign) NSURLRequestCachePolicy cachePolicy;
/**
若是設置HTTPShouldHandleCookies爲YES,就處理存儲在NSHTTPCookieStore中的cookies
HTTPShouldHandleCookies表示是否應該給request設置cookie並隨request一塊兒發送出去
*/
@property (nonatomic, assign) BOOL HTTPShouldHandleCookies;
/**
HTTPShouldUsePipelining表示receiver(理解爲iOS客戶端)的下一個信息是否必須等到上一個請求回覆才能發送。
若是爲YES表示能夠,NO表示必須等receiver收到先前的回覆才能發送下個信息。
*/
@property (nonatomic, assign) BOOL HTTPShouldUsePipelining;
/**
設定request的network service類型. 默認是`NSURLNetworkServiceTypeDefault`.
這個network service是爲了告訴系統網絡層這個request使用的目的
好比NSURLNetworkServiceTypeVoIP表示的就這個request是用來請求網際協議通話技術(Voice over IP)。
系統能根據提供的信息來優化網絡處理,從而優化電池壽命,網絡性能等等
*/
@property (nonatomic, assign) NSURLRequestNetworkServiceType networkServiceType;
/**
超時機制,默認60秒
*/
@property (nonatomic, assign) NSTimeInterval timeoutInterval;
而後判斷mutableObservedChangedKeyPaths是否包含以上這些keypath
mutableObservedChangedKeyPaths是一個集合,在初始化時,能夠看到
循環遍歷將每一個屬性就行KVO監聽
當值進行改變的時候,加入到mutableObservedChangedKeyPaths中。 這個集合中的值,始終會是最新的值。 那麼哪裏會產生keypath值的變化呢?
實在這些屬性的set方法中,實現了手動KVO進行監聽。
只要外部對這些屬性的值進行改變,這個集合就會更新同步。 在每一次的請求中,就會根據這個集合構建NSMutableURLRequest 。
第三步
一、
HTTPRequestHeaders 這個是能夠自定義的請求頭。 能夠調用set方法賦值。
二、
通常咱們請求都會按照key = value 的方式帶上各類參數,GET方法參數直接加在URL上,POST方法放在body上,NSURLRequest 沒有封裝好這個參數的解析。 AFNetworking 提供了接口,讓參數能夠是NSDictionary ,NSArray ,NSSet這些類型,再由內部解析成字符串後賦給NSURLRequest。
queryStringSerialization是一個block,能夠選擇實現這個block,本身去解析。
AFQueryStringFromParameters 這個方法 就是AF提供的函數。 遞歸調用並解析。 效果以下:
- Printing description of parameters:
- {
- baz = (
- 1,
- 2,
- 3
- );
- foo = bar;
- }
- Printing description of query:
- baz[]=1&baz[]=2&baz[]=3&foo=bar
三、
HTTPMethodsEncodingParametersInURI中,包含的是GET,HEAD,DELETE 由於這幾個method 的quey 都是拼接到URL後面的
而POST和PUT 都是把query 放到body中的。
其他部分:
Multipart協議
AFURLRequestSerialization是一個協議,只有requestBySerializingRequest一個方法。
AFHTTPRequestSerializer遵循了這個協議,他有幾個子類
1.AFJSONRequestSerializer
2.AFPropertyListRequestSerializer
子類都實現了這個協議,實現具體的邏輯業務。