1. 程式人生 > >iOS一行程式碼搞定網路請求(AFNetWorking結合ReactiveCocoa)(3)

iOS一行程式碼搞定網路請求(AFNetWorking結合ReactiveCocoa)(3)

1、響應式封裝網路請求的優點

  • 統一處理(返回結果解析的統一處理,錯誤的統一處理)
  • 對網路異常情況的提前處理,和請求後的統一處理
  • 使用RACSignal的各種操作符,例如fiter,map,flatternMap,merge等,滿足各種需求
  • 程式碼更簡練優雅

2、網路監聽

  • 實時監聽
   [[[AFNetWorkUtils sharedAFNetWorkUtils] startMonitoringNet] subscribeNext:^(NSString *netStatus) {
               //此處為每當網路狀態改變時,自動呼叫,返回結果:1、WIFI 2、2G/3G/4G 3、網路已斷開 4,其他情況 四種情況
}];
  • 獲得當前的網路狀態
[AFNetWorkUtils sharedAFNetWorkUtils].netType;

放回結果是一個列舉

typedef NS_ENUM(NSInteger, NetType) {
    NONet,
    WiFiNet,
    OtherNet,
};

3、 get請求

  [[AFNetWorkUtils get2racWthURL:url] subscribeNext:^(id result) {
                //成功返回(result class is NSDictionary
)
} error:^(NSError *error) { //錯誤處理 }];
 [[AFNetWorkUtils racGETWithURL:url class:Weather.class] subscribeNext:^(id result) {
               //直接獲得模型物件(result class is NSObject or NSArray)
            } error:^(NSError *error) {
                //錯誤處理
            }];

4、post請求

  [[AFNetWorkUtils racPOSTWthURL:url  params:params] subscribeNext:^(id result) {
                //成功返回(result class is NSDictionary)
            } error:^(NSError *error) {
             //錯誤處理
            }];
 [[AFNetWorkUtils racPOSTWithURL:url  params:params class:Weather.class] subscribeNext:^(id result) {
               //直接獲得模型物件(result class is NSObject or NSArray)
            } error:^(NSError *error) {
                //錯誤處理
            }];

5、獲取非JSON 資料(例如String型別資料)

  [[AFNetWorkUtils get2racUNJSONWthURL:unJSONUrl] subscribeNext:^(NSData *result) {
                //返回結果為NSData 型別
            }];

6、返回結果解析的統一處理,錯誤的統一處理

如果伺服器返回的資料,都有固定的格式,如果在工具類進行統一的解析,就不用再每次網路請求時都去解析一次了。
例如

    {
        "status": "ok",
        "id": 2774402,
         result:{

         },
    }
或者
{
        "status": "ok",
        "id": 2774402,
         result:[

         ],
 }
 或者 
 {
      "status": "error",
      "error": "Post ID '61355' not found."
 }

則可直接獲取result結果,或者錯誤資訊。

7、對網路請求的各種需求(ReactiveCocoa方式的解決方案)

  • 同步的兩次網路請求,即上一次的網路請求結果,是下一次網路請求的引數。

    例如authToken失效了,先去請求authToken,才能進行當前的請求(Flatternmap

[AFNetWorkUtils racGETWthURL:getAuthTokenURL] flattenMap:^RACStream *(NSString* authToken) {
        return [AFNetWorkUtils racGETWthURL:nowURL];
    };
  • 兩個網路請求一步執行,但需要結果統一的處理

    例如,新聞類APP,都是先載入快取資料,再載入網路資料,兩個請 求結果都要載入到UITableView上。

[RACSignal merge:@[dbSignal, netSignal]];
  • 對請求的過濾(filter)
  • 對返回結果的二次處理(map)
  • 副作用(doNext)
  • 配合RACComand ,對請求開始,請求中,請求結束的處理