iOS. Приемы программирования
Шрифт:
Все действительно просто. В более ранних версиях iOS SDK соединения по URL происходили с применением делегирования, но теперь модель стала обычной блоковой и вам не придется заниматься реализацией делегатов.
11.2. Обработка задержек при асинхронных соединениях
Необходимо задать лимит ожидания — проще говоря, задержку — при асинхронном соединении.
Решение
Задайте задержку в URL-запросе, посылаемом классу NSURLConnection.
Обсуждение
При инстанцировании объекта типа NSURLRequest для передачи URL-соединения можно воспользоваться методом класса requestWithURL: cachePolicy: timeoutInterval:, относящимся к этому объекту, и передать желаемую длительность задержки в секундах в параметре timeoutInterval.
Например, если вы готовы не более 30 секунд дожидаться, пока загрузится содержимое главной страницы Apple (с применением синхронного соединения), создайте ваш URL таким образом:
Что же здесь происходит? Дело в том, что среда времени исполнения пытается получить содержимое, расположенное по предоставленной ссылке. Если это удается сделать в течение заданных 30 секунд и соединение устанавливается до возникновения задержки — хорошо. В противном случае среда времени исполнения выдаст вам ошибку задержки (error) в соответствующем параметре завершающего блока.
11.3. Синхронная загрузка с применением NSURLConnection
Постановка задачи
Необходимо синхронно загрузить информацию, расположенную по имеющемуся URL.
Решение
Используйте метод класса sendSynchronousRequest: returningResponse: error:, относящийся к классу NSURLConnection. Возвращаемое значение этого метода — данные типа NSData.
Обсуждение
Пользуясь методом класса sendSynchronousRequest: returningResponse: error:, относящимся к классу NSURLConnection, можно посылать синхронный запрос к URL. А теперь внимание! Синхронные соединения не обязательно блокируют главный поток. Эти соединения блокируют актуальный поток, то есть выполняющий текущую задачу, и если этот поток не главный, то главный поток останется свободным. Если приступить к обработке глобальной параллельной очереди в GCD, а потом инициировать синхронное соединение, то вы не заблокируете главный поток.
Попробуем инициировать наше первое синхронное соединение и посмотрим, что произойдет. В данном примере мы попытаемся получить домашнюю страницу сайта Yahoo!: