4 AFURLRequestSerialization

這個方法就是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提供的函數。 遞歸調用並解析。 效果以下:
 
  1. Printing description of parameters:
  2. {
  3.     baz = (
  4. 1,
  5. 2,
  6. 3
  7. );
  8.     foo = bar;
  9. }
 
  1. Printing description of query:
  2. 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 
 
子類都實現了這個協議,實現具體的邏輯業務。 
相關文章
相關標籤/搜索