UIAlerView + AFNetworking在UIAlertView中显示错误消息
AFNetworking 2.0附带有一个类UIAlertView + AFNetworking.h。我用它来显示我的应用程序的错误消息是这样的:UIAlerView + AFNetworking在UIAlertView中显示错误消息
[UIAlertView showAlertViewForTaskWithErrorOnCompletion:task delegate:nil]
但我想UIAlertView中的消息中添加一些其他的消息。
即:
的StatusCode:422
JSON数据:{ “错误”:{ “细节”: “密码错误”}}
如何获得“密码错误“并通过UIAlertView + AFNetworking中的函数显示在UIAlertView中? localizedDescription
,localizedRecoverySuggestion
和localizedFailureReason
-
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
)来设置适当responseSerializer上AFHTTPSessionManager
实例。如果您像我一样继承这个类,则可以简单地在init方法中执行以下操作:
self.responseSerializer = [CustomResponseSerializer serializer];