UIAlerView + AFNetworking在UIAlertView中显示错误消息

问题描述:

AFNetworking 2.0附带有一个类UIAlertView + AFNetworking.h。我用它来显示我的应用程序的错误消息是这样的:UIAlerView + AFNetworking在UIAlertView中显示错误消息

[UIAlertView showAlertViewForTaskWithErrorOnCompletion:task delegate:nil] 

但我想UIAlertView中的消息中添加一些其他的消息。

即:

的StatusCode:422

JSON数据:{ “错误”:{ “细节”: “密码错误”}}

如何获得“密码错误“并通过UIAlertView + AFNetworking中的函数显示在UIAlertView中? localizedDescriptionlocalizedRecoverySuggestionlocalizedFailureReason -

UIAlertView+AFNetworking类别从NSError使用错误消息。 AFNetworking在失败时生成NSError,但是,您必须编写自己的responseSerializer以在其中设置自定义错误消息。

本主题已经被彻底讨论on GitHub,我使用的解决方案为@camdez的代码片段。从API

我的错误响应消息是这样的:

{ error: { message: "This username already exists" } } 

现在,我已经子类AFJSONResponseSerializer和发生错误时,我保存错误消息到NSError实例。

CustomResponseSerializer.h

@interface CustomResponseSerializer : AFJSONResponseSerializer 

@end 

CustomResponseSerializer.m

@implementation CustomResponseSerializer 

- (id)responseObjectForResponse:(NSURLResponse *)response 
          data:(NSData *)data 
          error:(NSError *__autoreleasing *)error 
{ 
    id JSONObject = [super responseObjectForResponse:response data:data error:error]; // may mutate `error` 

    if (*error && [JSONObject objectForKey:@"error"]) { 
     NSMutableDictionary *mutableUserInfo = [(*error).userInfo mutableCopy]; 

     mutableUserInfo[NSLocalizedFailureReasonErrorKey] = [[JSONObject objectForKey:@"error"] objectForKey:@"message"]; 

     NSError *newError = [NSError errorWithDomain:(*error).domain code:(*error).code userInfo:[mutableUserInfo copy]]; 
     (*error) = newError; 
    } 

    return JSONObject; 
} 

@end 

最后,你需要(如果你使用NSURLConnection的API或AFHTTPRequestOperationManager)来设置适当responseSerializerAFHTTPSessionManager实例。如果您像我一样继承这个类,则可以简单地在init方法中执行以下操作:

self.responseSerializer = [CustomResponseSerializer serializer];