【问题标题】:How to call an iOS method from the failure block of same method?如何从同一方法的失败块中调用 iOS 方法?
【发布时间】:2016-07-22 19:05:42
【问题描述】:

我创建了一个继承自 AFHTTPSessionManager 的网络管理器类,并在该类中定义了 GET、POST 等方法。这是 POST 实现 -

- (NSURLSessionTask*)performPOSTRequestToURL:(NSString*)postURL andParameters:(NSDictionary*)parameters withCompletionBlock:(WebServiceCompletionResponse)completionBlock {

    [self POST:postURL parameters:parameters progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id  _Nullable responseObject) {
        /* Token is still valid, got success response / data */
        if (completionBlock) {
            completionBlock(responseObject);
        }
    } failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
        if ([error code] == SESSION_EXPIRED_CODE) { /* Token has expired because error code is SESSION_EXPIRED_CODE */

            /* Make call to refresh token */
            [[TokenLibrary sharedInstance] refreshToken:^(NSError *error, NSString *token) {
                if (error) {
                    completionBlock(error);
                }
                else{
                    /* Got refreshed token, I want to call performPOSTRequestToURL with the same url now. How do I do it? Is the call below okay? */
                    [self performPOSTRequestToURL:postURL andParameters:parameters withCompletionBlock:completionBlock];
                }
            }];
        }
    }];
}

我在上面的最后一条评论中提出了我的问题。

基本上,我进行网络调用以发布或获取数据,如果我从 web 服务获得 SERVER_EXPIRED_CODE 作为错误响应,我需要先刷新令牌,然后再次进行相同的 API 调用。

我可以直接调用方法来代替最后的注释吗?或者有其他或更好的方法吗?

【问题讨论】:

  • 是的,你在正确的轨道上,这是一种在成功刷新令牌后调用 api 的干净方法。
  • @AtWork 感谢您的快速回复。我已经编辑了代码块以实际进行调用 - [self performPOSTRequestToURL:postURL andParameters:parameters withCompletionBlock:completionBlock];这看起来不错?
  • 对我来说看起来不错,应该可以。你试过运行它吗?
  • 是的,我做到了,但还不能检索 SESSION_EXPIRED_CODE。将尝试以某种方式模拟或联系服务团队。否则效果很好。非常感谢您的回复。
  • 尝试在浏览器中运行该服务,无论它是否良好。

标签: ios objective-c afnetworking objective-c-blocks


【解决方案1】:

在此块中,您仍然可以访问当前调用参数,因为它是由块捕获的。只需使用 [self performPOSTRequestToURL: postURL ...] 调用具有相同参数的当前方法。

【讨论】:

  • 谢谢,我再次用实际调用编辑了代码块。我相信它应该是这样的?
  • 也许最好在 POST 方法中实现令牌刷新令牌逻辑。即使使其更通用,也可以与 PUT、PATCH... http 方法一起使用,您应该在这些方法之后使用通用方法自动嗅探服务器错误方法调用响应。
  • [self POST...] 调用是对 AFHTTPSessionManager 方法的调用。是的,但我明白你的意思。我会尝试以其他方式使其通用或更简洁。
  • 请检查这个答案,他们谈论覆盖 afnetworking 方法来处理重复呼叫stackoverflow.com/questions/12893837/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多