Как преждевременно отменить запрос в RestKit и вызвать 'didFailWithError'

Я использую RestKit в моем проекте Objective-C и должен указать время ожидания для моего обслуживания около 10 секунд.

После прочтения это выглядит не так, как RestKit поддерживает это, поэтому мой план состоит в следующем:

  • Запустите таймер при отправке моего запроса.
  • Когда данные загружаются, отключите таймер

Здесь моя проблема...

Если срабатывает метод таймера, мне нужно отменить запрос и вызвать метод ниже вручную. Я не уверен на 100%, как добиться этого.

Есть какой-то контекст в моем другом вопросе, показывающий, как RestKit реализуется в моем проекте и что он делает в этом случае.

Большое спасибо заранее за любую помощь, которую вы можете дать мне на этом.

- (void)objectLoader:(RKObjectLoader*)objectLoader didFailWithError:(NSError*)error { 
     NSLog(@"Hit error: %@", error); 
}

Ответ 1

Вы можете использовать cancelRequestsWithDelegate: селектор для достижения описанного рабочего процесса.

- (void)cancelAfterTimeout {
    [[[[RKObjectManager sharedManager] client] requestQueue] cancelRequestsWithDelegate:self];
    NSError *myError = [[[NSError alloc] initWithDomain:NSPOSIXErrorDomain
            code:12345 userInfo:nil] autorelease];
    //feel free to customize the error code, domain and add userInfo when needed.
    [self handleRestKitError:myError];
}

Однако было бы сложно вызвать обработчик ошибок делегата, но вы можете обойти его, создав новый отдельный обработчик ошибок следующим образом:

- (void)handleRestKitError:(NSError*)error {
    //do something with the error
}

и измените тело вашего метода didFailWithError::

- (void)objectLoader:(RKObjectLoader*)objectLoader didFailWithError:(NSError*)error { 
     [self handleRestKitError:error] 
}

Ответ 2

В RestKit версии 0.20.x вы можете отменить запланированные запросы, используя

[[RKObjectManager sharedManager]
    cancelAllObjectRequestOperationsWithMethod:RKRequestMethodAny
                           matchingPathPattern:YOUR_PATTERN];

Ответ 3

Вы всегда можете: [[RKObjectManager sharedManager].operationQueue cancelAllOperations]; Каждый из ваших запросов завершится с ошибкой -999 (операция отменена). Вы можете проверить код ошибки и выполнить соответствующее действие.