2016-07-22 39 views
1

我已经创建了一个继承自AFHTTPSessionManager的网络管理器类,并且已经为该类中的GET,POST等定义了方法。这里是POST实现 -如何从相同方法的失败块中调用iOS方法?

- (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]; 
       } 
      }]; 
     } 
    }]; 
} 

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

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

我可以直接进行方法调用而不是最后的评论吗?或者有另一种或更好的方法来做到这一点?

+2

是的,你是在正确的轨道上,这是一个干净的方式来回忆一旦你成功刷新令牌api。 – AtWork

+0

@AWork感谢您的快速回复。我编辑了代码块以实际进行调用 - [self performPOSTRequestToURL:postURL andParameters:parameters withCompletionBlock:completionBlock];这看起来好吗? – letsbondiway

+0

看起来很好,我应该工作。你尝试过运行它吗? – AtWork

回答

0

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

+0

谢谢,我再次通过实际调用编辑了代码块。我相信这是怎么回事? – letsbondiway

+0

也许最好在POST方法内部实现令牌刷新令牌逻辑。即使使用它也与PUT,PATCH ... http方法一样更通用,那么在这些方法调用响应之后,您应该使用泛型方法自动嗅探服务器错误。 –

+0

[self POST ...]调用是AFHTTPSessionManager的方法。是的,但我理解你的观点。我会尝试以其他方式使其变得通用或更清洁。 – letsbondiway