1

我一直在努力为这个问题找到一个干净的解决方案,我已经创建了一个应用程序,它可以发出多个安静的 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"]);
    }
}];
4

2 回答 2

1

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

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

您可以在此链接中找到有关创建和使用队列的更多信息。

于 2013-07-29T13:27:25.403 回答
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*/
});
于 2013-07-29T13:19:37.023 回答