如果失败,iOS将运行两个异步方法
我有一个场景,当我访问其他API时,如果授权令牌(relogin)过期,我需要再次静默刷新它,但我很难思考如何在不为每个API创建冗余代码的情况下对其进行编码,即使流程类似 当用户已过期身份验证令牌>呼叫付费API A(返回401 Unauthorized)>再次重新登录>呼叫付费API A(成功运行) 第二次调用付费API时,我很难用更少的代码和不陷入无限循环的陷阱。有没有像NSNotification center这样的方法对这种情况有用 注意:我需要从NetworkingLogin使用此格式的API如果失败,iOS将运行两个异步方法,ios,asynchronous,login,Ios,Asynchronous,Login,我有一个场景,当我访问其他API时,如果授权令牌(relogin)过期,我需要再次静默刷新它,但我很难思考如何在不为每个API创建冗余代码的情况下对其进行编码,即使流程类似 当用户已过期身份验证令牌>呼叫付费API A(返回401 Unauthorized)>再次重新登录>呼叫付费API A(成功运行) 第二次调用付费API时,我很难用更少的代码和不陷入无限循环的陷阱。有没有像NSNotification center这样的方法对这种情况有用 注意:我需要从NetworkingLogin使用此格
- (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);
}];
}如果我没弄错,你可以把它分成两种方法。再试一次,就给我一个教训。e、 g:
- (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);
}];
}
在大多数情况下,将弱自我用于块是一个好主意