2016-04-27 31 views
1

我使用AFNetworking作爲一個很好的庫來處理網絡。通常我有一些API類處理所有請求到服務器。 API類是一個單身人士,包括一些基本的網址配置,幾個塊(關閉)成功和失敗,通常將數據傳回到請求的控制器(對象)和更新UI /目前新的視圖控制器等。AFNetworking將邏輯從視圖控制器和職責中分離出來以顯示數據的最佳實踐

我的問題是可以直接在API類中處理警報錯誤。例如,如果我們收到一些錯誤表單服務器,我是否需要直接在API類中處理這些錯誤,或者我需要將它們傳回控制器和控制器,並根據錯誤類型進行回調,並顯示需要硬編碼信息的警報。像「你已經進入了錯誤的電子郵件或密碼」等

而且是從後端的成功塊或在AFNetworking不良區例如當我們GET/POST/PUT/DELET東西這個最佳實踐處理錯誤。

據我所知,我們有很多http代碼錯誤,我們可以自動處理(狀態代碼400錯誤的請求等)。但是如果這是自定義錯誤,那麼狀態碼對於這種情況更好,我想答案是 - 我們應該使用failure回調來處理服務器的錯誤。但是,如果這個自定義錯誤需要澄清。

彙總

  1. 第一個問題是關於執行表示基於錯誤警報用戶。我們應該使用哪個類(或者取決於)。
  2. 第二個問題是關於成功/失敗塊,一個應該處理自定義錯誤,或者我們每次需要switch錯誤的AFNeteworking

回答

0

First question is about implementation of showing alerts to user based on error. Which class should we use for this (or it depends).

不良區在這一點上,相當多的選擇應該考慮周到。但我會分享我的經驗。爲了解決這類問題,我使用自己的類來顯示應用程序中的警報。這是由於在一個類中高度自定義警報而完成的。

例子:

CustomAlertController.alert("Test title", message: "message", acceptMessage: "OK") {() ->() in 

} 

根據您正在使用你可以定義你應該顯示警告的模式。在我的應用程序中,我使用MVC。所以我的ViewController類應該顯示基於MVC規則的警告對話框。

MainViewController -> (Ask for data) NetworkController -> (Response with completion block) -> MainViewController -> (Show alert with response) 

Second question is about success/failure block which one should handle custom error, or we need to switch error every time in failure block of AFNeteworking

我喜歡研究新框架(莫亞),其呈現在Github,所以我發現一個,讓我的眼光約易於使用和管理框架,讓機會來處理網絡要求。所以基於他們可以回答你的問題。

從Moya的小例子:

provider.request(.Zen) { result in 
    switch result { 
    case let .Success(moyaResponse): 
     // do something with the response data or statusCode 
    case .Failure(error): 
     // this means there was a network failure - either the request 
     // wasn't sent (connectivity), or no response was received (server 
     // timed out). If the server responds with a 4xx or 5xx error, that 
     // will be sent as a ".Success"-ful response. 
    } 
} 

由於有可能以結束開關情況下,用於請求結果的手柄的使用是由於代碼和簡單的高可讀性相當好的方法。

+0

感謝答案,所以我的理解,如果我們從服務器的一些失敗響應,我們應該處理它失敗的方法。我知道我們只需要成功使用成功方法,並且不能處理HTTP狀態代碼,因爲我知道我們需要從服務器接收到的進程自定義錯誤的故障塊。所以實際上,如果服務器向我發送了一些響應 - 「你的Alex帳戶使用的數據庫中沒有統計數據」,我猜這裏沒有HTTP狀態碼=)我應該在哪裏處理它?這肯定是後端問題。 –

+0

此響應的狀態碼可能爲200.而且是更後端的問題。我有類似的任務,我正在處理的幫助下。成功案例,因爲請求狀態是200.並且在成功案例中,我正在檢查響應是否包含以json提交的自定義錯誤。 –

+0

是的,那我問了什麼,所以我的問題是將自定義錯誤的邏輯處理成功或錯誤塊的最佳方式。因爲那樣我可以要求後端開發人員生成成功消息而不是錯誤,實際上最佳實踐是我最初的問題。 –

0

總結點1: 在處理所有請求到服務器的API類(AFHTTPSessionManager子類)中添加下面的方法代碼。 API調用---

- (void)getMyRecordsFromServer:(NSString *)url withLastModified:(NSTimeInterval)lastModified callbackHandler:(void (^)(id, NSError *))handler { 

    self.requestSerializer = [AFHTTPRequestSerializer serializer]; 
    self.responseSerializer = [AFHTTPResponseSerializer serializer]; 


    [self GET:url parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { 
    handler(responseObject, nil); 

} failure:^(NSURLSessionDataTask *task, NSError *error) { 

    /**********************************************************************/ 
    NSHTTPURLResponse *response = error.userInfo[AFNetworkingOperationFailingURLResponseErrorKey]; 
    NSInteger statusCode = response.statusCode; 
    NSLog(@"Error Code=%ld",(long)statusCode); 
    NSLog(@"Desc=%@",response.description); 
    /**********************************************************************/ 
    [self baseFailureWithError:error onFailure:handler]; 

}]; 

}

成功調用----

- (void)myGetRequestWithSuccess:(void (^)(id))success 
       onFailure:(void (^)(NSError *))failure 
{ 
    [self GET:@"api/object" 
      parameters:nil 
      success:^(NSURLSessionDataTask *task, id responseObject) 
      { 
       // success code here. 
      } failure:^(NSURLSessionDataTask *task, NSError *error) 
      { 
      [[self class] baseFailureWithError:error onFailure:failure]; 
      }]; 
} 

後實現通用邏輯baseFailureWithError ::類的方法,然後給回電話給你的看法控制器來實現用戶特定的錯誤驗證。 失敗呼叫----

- (void)baseFailureWithError:(NSError *)error 
       onFailure:(void(^)(id responseObject,NSError *error))failure 
{ 
if (failure){ 
    NSHTTPURLResponse *response = error.userInfo[@"AFNetworkingOperationFailingURLResponseErrorKey"]; 

    if ([response isKindOfClass:[NSHTTPURLResponse class]] && response.statusCode == 401){ 
     NSLog(@"Handle all 401's!"); 
     // decide show alert or not for point 2 
    } else { 
     failure(nil, error); 
    } 
    } 
} 
+0

謝謝!是的,我明白了,但是如果我有20個自定義錯誤消息返回自定義錯誤的自定義請求,我是否需要重載baseFailureWithError以及很多if塊? –

+0

對於常見的錯誤消息,您可以在塊中多顯示一個。但是可以通過回調來處理特定於API的自定義錯誤消息。 – kaushal

+0

我已通過添加API調用使我的答案更具描述性。方法params可以根據需要進行更改。 – kaushal