NSData
всегда имел очень удобный метод, называемый +dataWithContentsOfURL:options:error:
. Хотя это удобно, оно также блокирует выполнение текущего потока, что означает, что он был практически бесполезен для производственного кода (Игнорирование NSOperation
). Я использовал этот метод так редко, я полностью забыл, что он существует. До недавнего времени.
То, как я собирал данные из трубок, является стандартным подходом NSURLConnectionDelegate
: напишите класс загрузки, который обрабатывает различные методы NSURLConnectionDelegate
, постепенно наращивает некоторые данные, обрабатывает ошибки и т.д. Я обычно сделайте это общее достаточно для повторного использования для максимально возможного количества запросов.
Скажем, мой типичный класс загрузчика запускается где-то на стадионе 100 строк. Это 100 строк, чтобы сделать асинхронно то, что NSData
может выполнять синхронно в одной строке. Для большей сложности этому классу загрузчика нужен собственный протокол делегирования, чтобы сообщить о завершении и ошибках его владельцу, и владельцу необходимо каким-то образом реализовать этот протокол.
Теперь войдите в Grand Central Dispatch, и я могу сделать что-то столь же фантастически просто, как:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
NSData* data = [NSData dataWithContentsOfURL:someURL];
// Process data, also async...
dispatch_async(dispatch_get_main_queue(), ^(void) {
// Back to the main thread for UI updates, etc.
});
});
И я могу бросить эту присоску в любом месте, где хочу, прямо в строке. Нет необходимости в классе загрузки, нет необходимости обрабатывать методы делегирования соединений. Легкие данные async всего в нескольких строках. Несоответствие между этим подходом и моим пред-GCD-подходом имеет такую величину, которая достаточно велика, чтобы вызвать Too Good, чтобы быть True Alarm.
Таким образом, мой вопрос: Существуют ли какие-либо предостережения для использования NSData
+ GCD для простых задач загрузки данных вместо NSURLConnection
(Предполагая, что меня не интересуют такие вещи, как процесс загрузки)?