使用 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中的Afnetworking抛出错误

IOS 中 AFNetworking 缓存图像中的内存泄漏

在 iOS 5 中使用 AFNetworking 解析 JSON

AFNetworking 2.0 请求挂在 iOS 9 / WatchOS 2 中的 Today Extension 和 Watch 应用程序中

AFNetworking 2.0 iOS 7 复制与 AFHTTPRequestOperation.h 文件中的区域警告