AFNetworking全局提示用户登录401错误代码?

时间:2013-07-29 12:51:45

标签: ios objective-c afnetworking

我一直在努力为这个问题找到一个干净的解决方案,我已经创建了一个应用程序,它可以使多个宁静的Web服务请求工作正常,但是请求的一部分,登录详细信息或API密钥可能会过期,我需要能够处理这个并再次向用户显示登录屏幕。

在我的API客户端类中,我正在执行以下操作,但是因为应用程序执行多个Web服务请求,所以我多次看到UI AlertView。

关于我如何制作这段代码的任何想法只针对发生的第一个错误运行一次并且只显示一个警报视图?

    AFJSONRequestOperation *operation = [[AFJSONRequestOperation alloc] initWithRequest:apiRequest];
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    completionBlock(responseObject);
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSInteger statusCode = [operation.response statusCode];

    if (statusCode == 401) {
           [UIAlertView error:@"Your session has expied, please log in again."];
           [[NSNotificationCenter defaultCenter]
            postNotificationName:@"Logout"
            object:self];
    } else {
        completionBlock([NSDictionary dictionaryWithObject:[error localizedDescription] forKey:@"error"]);
    }
}];

2 个答案:

答案 0 :(得分:1)

一种方法是创建一个包含当前登录状态的全局变量。如果请求未链接在一起,您应该在请求之前或成功/失败之前阻止检查此登录状态。

更好的方法是创建NSOperationQueue来管理AFJSONRequestOperation个对象。这样可以让您更好地控制每个请求的生命周期。如果返回401,则可以取消队列中的所有操作。

您可以找到有关创建和使用队列here at this link.

的更多信息

答案 1 :(得分:0)

通常,在初始化单个对象的共享实例时,您会遇到类似的问题,以避免多次执行初始化。

解决此问题的一种方法是使用Grand Central Dispatch的dispatch_once,如下所示,它也包含在Xcode中作为默认代码段(GCD:Dispatch Once)。在您的情况下,您会在传递给dispatch_once的区块内显示提醒。

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    /*code to be executed once*/
});