Отмена NSData initWithContentsOfURL в NSOperation - PullRequest
1 голос
/ 02 февраля 2012

У меня в настоящее время есть следующий код в NSOperation, у которого есть наблюдатель для keyPath "isCancelled":

    downloaded = FALSE;
    NSURL *url = [NSURL URLWithString:requestString];
    dataXML = [[NSData alloc] initWithContentsOfURL:url];
    downloaded = TRUE;

Я хочу сделать так, чтобы функция Наблюдение за ValueForKeyPath могло отменить продолжение dataXML или просто полностью остановить операцию NSOperation, когда NSOperation отправлено сообщение об отмене. Отмена операции отмены NSOperation только уведомляет операцию о том, что она должна быть остановлена, но не заставляет код моей операции останавливаться.

1 Ответ

7 голосов
/ 02 февраля 2012

Вы не можете отменить его.

Если вы хотите иметь возможность отменить загрузку на полпути, используйте NSURLConnection, работая в асинхронном режиме.Это немного больше работы для настройки, но вы можете отменить в любой момент процесса загрузки.

В качестве альтернативы, вы можете использовать этот удобный класс Я написал, что оборачивает асинхронный NSURLConnectionего делегат в одном вызове метода; -)

NSURLRequest *request = [NSURLRequest requestWithURL:url];
[[RequestQueue mainQueue] addRequest:request completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) {

    if (data && error == nil)
    {
        //do something with your downloaded data
    }
}];

//to cancel the download at any time, just say
[[RequestQueue mainQueue] cancelRequest:request];

Easy!

</shamelessSelfPromotion>

Обратите внимание, что запрос выше уже асинхронный, и класс уже управляеторганизация нескольких запросов, поэтому вам не нужно (и не нужно) оборачивать их в NSOperationQueue.

...