Создают ли несколько NSURLConnections несколько NSThreads?

В документации NSURLConnection говорится, что NSURLConnection выполняется в отдельном потоке, а методы делегата вызываются в потоке, который запустил соединение.

У меня есть несколько объектов NSURLConnection, заключенных в объекты «URLDownload‹ NSURLConnectionDelegate> », которые я запускаю параллельно.

Приостановив свою программу (в какой-то момент я поставил в нее точку останова) и заглянув в Debug Navigator, я увидел только один поток com.apple.NSURLConnectionLoader.

Вот как, я думаю, это работает:

  1. Я создаю 5 объектов URLDownload (каждый из них имеет собственное NSURLConnection)
  2. Создается 5 потоков (по одному для каждого NSURLConnection)
  3. Каждый NSURLConnection вызывает свои методы делегата в потоке, который их запустил.

Итак, существует 5 потоков (по одному для каждого NSURLConnection), но их данные (метод didReceiveData ... и другие) обрабатываются в одном потоке.

Я правильно понял?


person vale4674    schedule 28.09.2012    source источник
comment
Ваш лучший вариант какой? Непонятно, в чем ваша проблема.   -  person hooleyhoop    schedule 28.09.2012
comment
@hooleyhoop Я не должен был добавлять это последнее предложение. Мой настоящий вопрос из названия вопроса. Я сниму.   -  person vale4674    schedule 28.09.2012


Ответы (1)


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

Потоки используют много ресурсов относительно объема работы сетевого подключения, поэтому 1 асинхронный NSURLConnection может использовать 1 фоновый поток, 2 асинхронных NSURLConnection могут использовать 2 фоновых потока, но 100 асинхронных NSURLConnections, вероятно, не будут использовать 100 фоновых потоков.

NSURLConnection - это черный ящик, который управляет оптимальной суммой за вас. Это может зависеть от того, сколько у вас процессоров, скорости вашей сети и т. Д. (NB, я не говорю, что знаю, как это работает под капотом, просто вам не нужно знать - он будет делать правильные вещи. поток на соединение было бы довольно ужасным способом сделать это).

Методы делегата (didReceiveData и т. Д.) Вызываются в потоке, запустившем соединение, так что это не то же самое, что сказать, что они вызываются в одном потоке. Если вы запустите 5 соединений в пяти разных потоках, вы получите обратные вызовы в пяти разных потоках.

person hooleyhoop    schedule 28.09.2012