1

AFNetworkingネットワークを扱うための良いライブラリとして使用しています。通常API、サーバーへのすべてのリクエストを処理するクラスがあります。APIクラスはシングルトンであり、いくつかのベース url 構成、いくつかのブロック (閉鎖) の成功と失敗が通常、要求されたコントローラー (オブジェクト) にデータを戻し、UI を更新する/新しいビュー コントローラーを提示するなどを含みます。

私の質問は、アラート エラーを API クラスで直接処理しても問題ないということです。たとえば、サーバーからエラーを受け取った場合、これらのエラーを API クラスで直接処理する必要がありますか、またはエラー タイプのコールバックに基づいてコントローラとコントローラに戻す必要がありますか?ハードコードされた情報を含む必要なアラートが表示されます。「間違ったメールアドレスまたはパスワードを入力しました」など。

また、このベスト プラクティスは、成功ブロックまたは失敗ブロックのバックエンドからのエラーを処理しAFNetworkingますGET/POST/PUT/DELET

私が知っているように、自動的に処理できる多くの http コード エラー (ステータス コード 400 の不正な要求など) があります。failureしかし、これがカスタムエラーである場合、この状況に適したステータスコードは何か、答えはサーバーからのエラーを処理するためにコールバックを使用する必要があると思います。しかし、このカスタムエラーの場合はどうすればよいでしょうか。

要約する

  1. 最初の質問は、エラーに基づいてユーザーにアラートを表示する実装についてです。これにはどのクラスを使用する必要がありますか (または場合によって異なります)。
  2. 2番目の質問は、カスタムエラーを処理する必要がある成功/失敗ブロックに関するものです。またはswitch、失敗ブロックで毎回エラーを発生させる必要がありますAFNeteworking
4

2 に答える 2

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:: クラス メソッドに汎用ロジックを実装し、View Controller にコールバックして、ユーザー固有のエラー検証を実装します。失敗コール----

 - (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);
    }
  }
}
于 2016-04-28T18:25:42.223 に答える