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, что означает, что срок действия токена пользователя истек, и ему необходимо повторно войти в систему, чтобы обновить свой токен.

У меня вопрос: как я могу повторить попытку операции после повторного входа?

Примечание: я не говорю о повторных попытках тайм-аута сети, которые я уже реализовал.

0 ответов

Другие вопросы по тегам