ios - AFNetworking:全局处理错误并重复请求

标签 ios networking afnetworking

我有一个应该很常见的用例,但我找不到使用 AFNetworking 处理它的简单方法:

每当服务器为任何请求返回特定状态代码时,我想:

  • 删除缓存的身份验证 token
  • 重新验证(这是一个单独的请求)
  • 重复失败的请求。

我认为这可以通过 AFHTTPClient 中的一些全局完成/错误处理程序来完成,但我没有发现任何有用的东西。那么,做我想做的事情的“正确”方法是什么?在我的 AFHTTPClient 子类中重写 enqueueHTTPRequestOperation:,复制该操作并用一个 block 包装原始完成处理程序来执行我想要的操作(重新验证、排队复制的操作)?还是我完全走错了路?

谢谢!

编辑:删除了对 401 状态代码的引用,因为当我使用 token 身份验证时,这可能是为 HTTP 基本保留的。

最佳答案

我使用另一种方法通过 AFNetworking 2.0 执行此操作。

您可以子类化 dataTaskWithRequest:success:failure: 并用一些错误检查包装传递的完成 block 。例如,如果您使用 OAuth,您可以观察 401 错误(过期)并刷新您的访问 token 。

- (NSURLSessionDataTask *)dataTaskWithRequest:(NSURLRequest *)urlRequest completionHandler:(void (^)(NSURLResponse *response, id responseObject, NSError *error))originalCompletionHandler{

    //create a completion block that wraps the original
    void (^authFailBlock)(NSURLResponse *response, id responseObject, NSError *error) = ^(NSURLResponse *response, id responseObject, NSError *error)
    {
        NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*)response;
        if([httpResponse statusCode] == 401){
            NSLog(@"401 auth error!");
            //since there was an error, call you refresh method and then redo the original task
            dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0), ^{

                //call your method for refreshing OAuth tokens.  This is an example:
                [self refreshAccessToken:^(id responseObject) {

                    NSLog(@"response was %@", responseObject);
                    //store your new token

                    //now, queue up and execute the original task               
                    NSURLSessionDataTask *originalTask = [super dataTaskWithRequest:urlRequest completionHandler:originalCompletionHandler];
                    [originalTask resume];
                }];                    
            });
        }else{
            NSLog(@"no auth error");
            originalCompletionHandler(response, responseObject, error);
        }
    };

    NSURLSessionDataTask *task = [super dataTaskWithRequest:urlRequest completionHandler:authFailBlock];

    return task;

}

关于ios - AFNetworking:全局处理错误并重复请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12893837/

相关文章:

android - 从我的 Android 平板电脑访问我的本地主机

ios - AFNetworking + CocoaSPDY 发送请求,没有得到响应

ios - iTunes 连接 : You must have only 1 Leaderboard as default

ios - 如何删除 Storyboard中 UIView 的底部空白区域?

java - 我如何识别网络应用程序的多个命令(Java)

ios - 带查询的 AFNetworking GET 请求不起作用

ios - Objective-C 中的类继承和自定义 ^block 执行

ios - 弹出 View Controller 时应用程序崩溃

ios - 将一系列不同的 SKAction 应用于不同的 SKNode

iphone - 两个 iOS 设备之间的通信