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.
});
});
И я могу добавить эту присоску куда угодно, прямо в линию. Нет необходимости в классе загрузки, нет необходимости обрабатывать методы делегирования соединения: простая асинхронная передача данных всего за несколько строк. Несоответствие между этим подходом и моим подходом до GCD достаточно велико, чтобы вызвать слишком хороший, чтобы быть истинной тревогой.
Таким образом, мой вопрос: есть ли какие-либо предостережения относительно использования NSData
+ GCD для простых задач загрузки данных вместо NSURLConnection
(при условии, что меня не волнуют такие вещи, как процесс загрузки)?