AFNetworking 2 Retry Pattern
Я использую AFNetworking 2.2.3
, AFNetworking+AutoRetry 0.0.3
а также AFKissXMLRequestOperation@aceontech 0.0.4
,
У меня есть следующие коды для получения данных с сервера:
+ (void)doNetwork {
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.responseSerializer = [AFKissXMLResponseSerializer serializer];
NSDictionary *param = [NSDictionary dictionaryWithObjectsAndKeys:@"someValue", @"someKey", nil];
[manager POST:@"http://example.com/api/" parameters:param success:^(AFHTTPRequestOperation *operation, id responseObject) {
NSError *error;
DDXMLDocument *xml = [[DDXMLDocument alloc] initWithXMLString:operation.responseString options:0 error:&error];
if(error != nil) {
NSLog(@"Error Parsing XML");
[[NSNotificationCenter defaultCenter] postNotificationName:@"FetchAPINotification" object:nil];
} else {
NSString *xPath = @"response/status";
NSArray *arr_status = [xml nodesForXPath:xPath error:nil];
if(arr_status == nil || arr_status.count == 0) {
NSLog(@"Status Not Found");
[[NSNotificationCenter defaultCenter] postNotificationName:@"FetchAPINotification" object:nil];
} else {
int status = [[arr_status objectAtIndex:0] intValue];
if(status == 0) { // OK
[[NSNotificationCenter defaultCenter] postNotificationName:@"FetchAPINotification" object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys:@"OK", @"status", nil];
} else if(status == 123) { // Requires Re-login
[self doLogin];
// How should I call the method again?
[self doNetwork];
} else {
[[NSNotificationCenter defaultCenter] postNotificationName:@"FetchAPINotification" object:nil];
}
}
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"Network Error");
[[NSNotificationCenter defaultCenter] postNotificationName:@"FetchAPINotification" object:nil];
} autoRetry:3];
}
Вот объяснение:
Прежде всего, я выдаю запрос HTTP POST, используя AFHTTPRequestOperationManager
с param
, Затем в успешном блоке, если статус = 0, отправьте уведомление предварительно определенному наблюдателю уведомлений, чтобы отметить успешное выполнение.
Если есть какая-либо ошибка, я отправляю уведомление без userInfo
пометить операцию не удалось.
Однако существует случай, когда сервер отвечает за состояние = 123, что означает, что срок действия токена пользователя истек, и ему необходимо повторно войти в систему, чтобы обновить свой токен.
У меня вопрос: как я могу повторить попытку операции после повторного входа?
Примечание: я не говорю о повторных попытках тайм-аута сети, которые я уже реализовал.