AFNetworking отменяет блокировку успеха

Я хочу остановить/отменить операцию в случае повторного запуска запроса. Метод cancelAllHTTPOperationsWithMethod работает нормально, но у меня проблема, когда AFNetworking уже получил результаты, и мой SuccessBlock срабатывает - я хочу остановить его в ближайшем будущем. Но проблема в том, что operation.isCancelled не отменяется.

Вопрос в том, нужно ли мне выполнять «очень длинный блок успеха» в NSOperation и также отменять их, или есть более простой и быстрый способ?

Код:

[[AFHTTPClient sharedInstance] cancelAllHTTPOperationsWithMethod:@"GET" path:@"path"];
[[AFHTTPClient sharedInstance] getPath:@"path" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
        for (longLoop) {
            // do something long 
            if (self.isCancelled) return; // this won't fire no matter how often i run it
        }
    });

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    // do something to fail
}];

person Nat    schedule 30.01.2014    source источник
comment
Вы можете проверить operation.isCancelled в этом цикле. Вы говорите, что operation.isCancelled не отменена, но это ничего не значит. Дело в том, установлено?   -  person trojanfoe    schedule 30.01.2014
comment
@trojanfoe Ну вот в чем дело и мой вопрос. Я ожидаю, что он будет установлен, потому что я вызываю cancelAllHTTPOperationsWithMethod ранее (код, который я вставил, находится в цикле, скажем), однако, если SuccessBlock начнет работать, даже если я отменю его через cancelAllHTTPOperationsWithMethod, флаг не изменится   -  person Nat    schedule 30.01.2014
comment
Итак, почему тест self.isCancelled?   -  person trojanfoe    schedule 30.01.2014
comment
@trojanfoe Я хотел подчеркнуть, что этот метод не работает. Я спрашиваю, что делать, чтобы знать, что SuccessBlock должен быть остановлен. Есть ли более быстрый способ, чем вставить всю отправку в NSOperation и отменить ее.   -  person Nat    schedule 30.01.2014


Ответы (1)


Я закончил тем, что сделал NSOperation внутри. Что-то типа:

[[AFHTTPClient sharedInstance] cancelAllHTTPOperationsWithMethod:@"GET" path:@"path"];
[operationQueue cancelAllOperations];

[[AFHTTPClient sharedInstance] getPath:@"path" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
    // add new operation
    MyOperation *successOperation = [[MyOperation alloc] init];
    [successOperation setResponseObject:responseObject];
    [operationQueue addOperation:successOperation];

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    // call delegate
    [self didFailFetchDataWithError:error];
}];
person Nat    schedule 30.01.2014