2015-05-28 27 views
0

我有一個場景,我需要再次安靜刷新身份驗證令牌(relogin),如果它過期了,當我訪問其他API,但我很難考慮如何編碼而不創建多餘即使流程類似,也爲每個API編碼。iOS運行兩個異步方法,如果失敗

當用戶已經過期的身份驗證令牌>電話支付API A(返回401未授權)>再次重新登錄>電話支付API A(成功運行)

我有包裝在我的腦海裏調用API支付有難第二次用較少的代碼,並沒有陷入無限循環陷阱。有沒有任何方法可用於NSNotification中心這種情況?

注:我需要在這個格式使用API​​從AFNetworkinglogin

- (NSURLSessionDataTask *)getApiA:(CallbackBlock)block{ 

CallbackBlock _block = [block copy]; 

NSString *urlString = [[NSURL URLWithString:GET_API_A_URL relativeToURL:[NSURL URLWithString:HOME_URL]] absoluteString]; 

return [self GET:urlString parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { 
    NSDictionary *response = (NSDictionary *)responseObject; 


    BLOCK_SAFE_RUN(block, response, nil, task); 

} failure:^(NSURLSessionDataTask *task, NSError *error) { 

    if([self unauthorizedAccess:task]){ //401 
     ***//call Login once again > run getApiA again*** 
    }else if ([self forbiddenAccess:task]){ //403 

    } 


    BLOCK_SAFE_RUN(block, nil, error, task); 
}]; 

}

回答

0

如果我得到它的權利,你可以把它分成2種方法。並再次通過布爾再試。例如:

- (NSURLSessionDataTask *)getApiA:(id)block { 
    NSString *urlString = [[NSURL URLWithString:GET_API_A_URL relativeToURL:[NSURL URLWithString:HOME_URL]] absoluteString]; 
    return [self doApiACallWithURL:urlString firstTry:YES completion:block]; 
} 

- (NSURLSessionDataTask *)doApiACallWithURL:(NSString *)url firstTry:(BOOL)first completion:(CallbackBlock)completion { 
    __weak typeof(self) wself = self; 
    return [self GET:urlString parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) { 
     NSDictionary *response = (NSDictionary *)responseObject; 

     BLOCK_SAFE_RUN(block, response, nil, task); 

    }  failure:^(NSURLSessionDataTask *task, NSError *error) { 

     if ([wself unauthorizedAccess:task]) { //401 
      if (first) { 
       [wself doApiACallWithURL:url firstTry:NO completion:completion]; 
      } 
     } else if ([wself forbiddenAccess:task]) { //403 

     } 

     BLOCK_SAFE_RUN(block, nil, error, task); 
    }]; 
} 

並且在大多數情況下使用弱自我表示塊是一個好主意。