1

我正在为我的 ios 应用程序使用 AFNetworking。

我按照文档的指示创建了一个 AFHTTPClient 的子类,它将发出我所有的 GET 和 POST 请求。

我的 ViewControllers 将收到任何错误消息以及来自这些请求的有效负载。一旦我的 AFHTTPClient 子类收到 401 状态代码,我将如何弹出登录屏幕?对于我发出的每一个请求,我都需要这种行为,所以当 401 冒泡到我的视图控制器时,我不想在过程中这么晚才写 showLoginScreen(),我想立即从 AFHTTPClient 内部显示登录屏幕,即使我在我的应用程序中深入了 5 个级别。

这是可能的还是一个坏主意?如何在不复制每个视图控制器中的代码的情况下自动弹出所有请求的登录屏幕?

我想覆盖我的 AFHTTPClient 子类中的一个方法,但我没有看到这样做的正确位置。我最初的候选人是 AFHTTPClient 内部的:

 - (void)getPath:(NSString *)path
         parameters:(NSDictionary *)parameters
            success:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
            failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
    {
        NSURLRequest *request = [self requestWithMethod:@"GET" path:path parameters:parameters];
        AFHTTPRequestOperation *operation = [self HTTPRequestOperationWithRequest:request success:success failure:failure];
        [self enqueueHTTPRequestOperation:operation];
    }

谁能指出插入我的“showLoginScreen()”方法的地方?

4

3 回答 3

2

您需要执行以下操作:

AFHTTPRequestOperation *operation = [[AFHTTPRequestOperation alloc] initWithRequest:request];

[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) {
    // Success Response
} 
failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    // Check if error code is 401
    // eg [error.userInfo[AFNetworkingOperationFailingURLResponseErrorKey] statusCode] == 401
    [[NSNotificationCenter defaultCenter] postNotificationName:@"UnauthorizedRequest" object:nil];
}];

在你的 AppDelegate.m

 [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(showLoginView)
                                             name:@"UnauthorizedRequest"
                                           object:nil];

现在只需执行showLoginView方法即可打开 LoginView。

于 2013-09-05T10:08:09.523 回答
1

一种解决方案是在发生 401 时发布您的AFHTTPClient subclass帖子,并让您聆听并展示您的登录屏幕......NSNotificationAppDelegate

于 2013-09-05T08:14:10.197 回答
1

谢谢您的帮助。

在 AFHTTPRequestOperation 类中,我添加了一行来发布 NSNotification,如下所示。

- (void)setCompletionBlockWithSuccess:(void (^)(AFHTTPRequestOperation *operation, id responseObject))success
                              failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error))failure
{
    // completionBlock is manually nilled out in AFURLConnectionOperation to break the retain cycle.
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-retain-cycles"
#pragma clang diagnostic ignored "-Wgnu"
    self.completionBlock = ^{
        if (self.error) {
            if (failure) {
                dispatch_async(self.failureCallbackQueue ?: dispatch_get_main_queue(), ^{
                [[NSNotificationCenter defaultCenter] postNotificationName:@"UnauthorizedRequest" object:nil];

                    failure(self, self.error);
                });
            }
        } else {
            if (success) {
                dispatch_async(self.successCallbackQueue ?: dispatch_get_main_queue(), ^{
                    success(self, self.responseData);
                });
            }
        }
    };
#pragma clang diagnostic pop
}
于 2013-09-05T15:31:57.270 回答