使用 iOS 中的 AFNetworking,确定失败响应是服务器错误还是连接错误的最佳方法是啥?
Posted
技术标签:
【中文标题】使用 iOS 中的 AFNetworking,确定失败响应是服务器错误还是连接错误的最佳方法是啥?【英文标题】:With AFNetworking in iOS, what is the best way to determine if a failure response is a server error or connection error?使用 iOS 中的 AFNetworking,确定失败响应是服务器错误还是连接错误的最佳方法是什么? 【发布时间】:2015-03-06 12:30:27 【问题描述】:使用 ios 中的 AFNetworking,确定失败响应是服务器错误还是连接错误的最佳方法是什么?
例如,如果由于连接错误导致上传失败,我可能想在一段时间后自动重试上传。相反,如果由于服务器错误导致上传失败,我将希望永久停止尝试该请求。 (我不想重试的错误最多是 400 和 500 错误。)
请告诉我如何最容易地确定我只是看到连接错误还是看到服务器错误?
【问题讨论】:
顺便说一句,您可能希望在分析中包含“可达性”(例如,如果AFNetworkReachabilityManager
说没有连接,甚至不要尝试连接,但请继续并尽快发出任何待处理的请求因为您被通知连接已恢复,而不是等待某个规定的时间段)。
【参考方案1】:
我使用以下 UIImageView 类别。它会在延迟 5 秒后尝试重新加载图像。
h 文件:
#import "UIImageView+AFNetworking.h"
@interface UIImageView (ConvenienceAdditions)
- (void)setAutoRetryImageWithURL:(NSURL *)url;
- (void)setAutoRetryImageWithURL:(NSURL *)url completion:(CompletionBlockCommon)block;
- (void)setAutoRetryImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholderImage completion:(CompletionBlockCommon)block;
- (void)setAutoRetryImageWithURLRequest:(NSURLRequest *)urlRequest placeholderImage:(UIImage *)placeholderImage completion:(CompletionBlockCommon)block;
@end
m 文件:
#import "UIImageView+ConvenienceAdditions.h"
static NSTimeInterval kDGImageReloadingAttemptInterval = 5;
@implementation UIImageView (ConvenienceAdditions)
- (void)setAutoRetryImageWithURL:(NSURL *)url
[self setAutoRetryImageWithURL:url completion:nil];
- (void)setAutoRetryImageWithURL:(NSURL *)url completion:(CompletionBlockCommon)block
[self setAutoRetryImageWithURL:url placeholderImage:nil completion:block];
- (void)setAutoRetryImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholderImage completion:(CompletionBlockCommon)block
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];
[request addValue:@"image/*" forHTTPHeaderField:@"Accept"];
[self setAutoRetryImageWithURLRequest:request placeholderImage:placeholderImage completion:block];
- (void)setAutoRetryImageWithURLRequest:(NSURLRequest *)urlRequest placeholderImage:(UIImage *)placeholderImage completion:(CompletionBlockCommon)block
__weak typeof (self) weakImageView = self;
[self setImageWithURLRequest:urlRequest placeholderImage:placeholderImage success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image)
__strong __typeof(weakImageView)strongImageView = weakImageView;
if (block)
block(image, nil);
else
strongImageView.image = image;
failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error)
if (error.code == NSURLErrorCancelled) // Check error's code
return ;
else if (response.statusCode >= 400) // Check response's code
return;
else
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, kDGImageReloadingAttemptInterval * NSEC_PER_SEC), dispatch_get_main_queue(), ^
[weakImageView setAutoRetryImageWithURLRequest:urlRequest placeholderImage:placeholderImage completion:block];
);
];
@end
应按以下方式使用:
[someImageView setAutoRetryImageWithURL:someImageURL];
【讨论】:
以上是关于使用 iOS 中的 AFNetworking,确定失败响应是服务器错误还是连接错误的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
使用 AFNetworking 从 ios 中的照片库上传图像?
在 iOS 5 中使用 AFNetworking 解析 JSON
AFNetworking 2.0 请求挂在 iOS 9 / WatchOS 2 中的 Today Extension 和 Watch 应用程序中
AFNetworking 2.0 iOS 7 复制与 AFHTTPRequestOperation.h 文件中的区域警告