Что именно NSUrlConnection ASynchronous означает?

Я запутался, в чем разница между синхронным NSUrlConnection и ASynchronous NSUrlConnection? есть синхронный или ASynchronous? если мы будем использовать detachNewThreadSelector в методе connectionDidFinishLoading, будет ли это ASynchronous NSUrlConnection? какой способ лучше? любой учебник...

4 ответа

Решение

Синхронный означает, что вы запускаете NSURLConnection запрос и ждать, пока это будет сделано.

Асинхронный означает, что вы можете инициировать запрос и делать другие вещи, пока NSURLConnection загружает данные.

Что является "лучшим"?

Синхронность очень проста: вы настраиваете ее, запускаете и ждете возвращения данных. Но ваше приложение находится там и ничего не делает, пока все данные не будут загружены, не произойдет какая-либо ошибка или не истечет время ожидания запроса. Если вы имеете дело с чем-то большим, чем небольшой объем данных, ваш пользователь будет сидеть там в ожидании, что не принесет хорошего впечатления пользователю.

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

Вы можете выполнять как синхронные, так и асинхронные запросы с NSURLConnection, Документация Apple содержит четкое объяснение двух подходов и методы делегирования, необходимые для последнего подхода.

Кажется, что вы объединяете синхронные / асинхронные соединения и потоки. В своем приложении я использовал асинхронные соединения в качестве альтернативы многопоточности.

Допустим, вы хотите загрузить большой файл, не вызывая зависания интерфейса. У вас есть два основных варианта:

  1. Асинхронное соединение. Вы начинаете с + connectionWithRequest:delegate: (или один из других вариантов без авто-выпуска), и он загружает биты файла, вызывая вашего делегата, когда происходит интересная вещь. Runloop все еще продолжается, поэтому ваш пользовательский интерфейс остается отзывчивым. Конечно, вы должны быть осторожны, чтобы ваш делегат не выходил за рамки.

  2. Синхронный. Вы начинаете соединение с + sendSynchronousRequest:returningResponse:error: но код ждет, пока загрузка не будет завершена. Вам действительно нужно порождать новый поток (или одну из операций с потоками более высокого уровня, которые поддерживает Какао), иначе пользовательский интерфейс будет блокироваться.

Какой вариант "лучший" или наименее болезненный, будет зависеть от архитектуры вашего приложения и того, чего вы пытаетесь достичь. Если вам все равно нужно создать поток для длительного процесса, вы можете выбрать второй вариант. Вообще я бы сказал, что первый вариант самый простой.

Все это довольно хорошо задокументировано на сайте разработчиков Apple.

Что-то, что не было упомянуто в других ответах, - это размер запроса. Например, если вы загружаете большой файл, лучше использовать асинхронное соединение. Ваш делегат будет получать блоки данных по мере их поступления. Для сравнения, синхронный метод будет ждать всех данных, прежде чем сделать их доступными для вас. Делегат может начать обработку ответа раньше (лучший пользовательский опыт) или сохранить его в файле вместо памяти (лучшее использование ресурсов). У вас также есть возможность остановить ответ, не дожидаясь всех данных.

По сути, асинхронный метод дает вам больше контроля над соединением, но за счет сложности. Синхронный метод намного проще, но его не следует использовать в основном потоке пользовательского интерфейса, потому что он блокируется.

В ответ на другие ответы относительно размера файла: я думаю, что размер файла не имеет значения. Если сервер реагирует очень медленно и вы загружаете данные синхронно, ваш пользовательский интерфейс по-прежнему зависает, даже если вы загружаете небольшой объем данных, например 3k.

Поэтому я бы выбрал асинхронный вариант в любой ситуации, потому что вы никогда не знаете, что вы получите в отношении размера файла, скорости отклика сервера или скорости сети.

Другие вопросы по тегам