2016-04-07 2 views
0

Я использую Restkit (0.20.3), скомпилированный на симулятор iPhone 5s (8.4).Restkit «cancelAllObjectRequestOperationsWithMethod» на уже запущенном запросе/сопоставлении

Таким образом, я видел много сообщений об «cancelAllObjectRequestOperationsWithMethod», чтобы отменить запрос. В настоящее время у меня есть запрос с большим пакетом JSON, который занимает несколько секунд для отображения в CoreData. Пользователь может вручную отменить запрос с помощью кнопки.

Если мое понимание верное, этот «cancelAllObjectRequestOperationsWithMethod» должен остановить запрос, даже если он в настоящее время работает? Если нет, то мой вопрос - как это сделать. Но если это должно остановить текущую операцию, то она, похоже, не работает на основе журналов, потому что я все еще вижу множество операторов печати для сопоставления для рассматриваемого API.

Вот мой код для запуска API:

@try{ 
     [[RKObjectManager sharedManager] getObjectsAtPath:path 
               parameters:nil 
                success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {}              failure:^(RKObjectRequestOperation *operation, NSError *error) {} 
@catch(NSException *e) { 
    NSLog(@"%@", e); 
} 

Вот мой код для отмены, когда пользователь нажимает на кнопку:

NSLog(@"%@", [[RKObjectManager sharedManager] enqueuedObjectRequestOperationsWithMethod:RKRequestMethodAny matchingPathPattern:path]); 
[[RKObjectManager sharedManager] cancelAllObjectRequestOperationsWithMethod:RKRequestMethodAny matchingPathPattern:path]; 
NSLog(@"%@", [[RKObjectManager sharedManager] enqueuedObjectRequestOperationsWithMethod:RKRequestMethodAny matchingPathPattern:path]); 

Первый NSLog показывает state: Executing, isCancelled=NO

во второй NSLog показывает state: Executing, isCancelled=YES

S o Я преуспел в , отменив, но отображение все равно продолжает отображаться в моих журналах. Возможно ли остановить его выполнение , а также на тот момент?

ответ

0

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

Когда вы отменяете операцию, вы просто устанавливаете флаг, это зависит от операции, чтобы проверить этот флаг и остановить. Каждая операция выбирает другое время (или множество раз) для проверки в зависимости от того, что они делают и как они это делают. Таким образом, независимо от того, что операция выполняет внутренне, когда вы отмените ее, она будет завершена, а потом она немного остановится.

Одним из ключевых моментов является то, что будущие отмененные операции даже не начнутся, а текущие отмененные операции не вызовут обработчик завершения.

Смежные вопросы