Аснхронные NSURLConnections многопоточные - PullRequest
4 голосов
/ 04 марта 2011

Я заметил, что если я создаю NSURLConnection и запускаю запрос, все хорошо. Мои методы делегата вызывают, и последний метод делегата вызывается хорошо после завершения блока кода, вызывающего соединение. Отлично.

Это наводит меня на мысль, что соединения асинхронные, что означает, что они многопоточные. Это верно? Могут ли они быть асинхронными, но в одном потоке? Нет, это безумие - верно?

Но в каждом примере, который я видел, используя NSOperation, NSURLConnections всегда запланированыInRunLoop, после чего [runLoop runMode ...] вызывается в цикле while.

Может кто-нибудь объяснить, что именно здесь происходит? Мне кажется, что в первом случае требуется создание вторичных потоков, но нет ручного вызова цикла выполнения (в этих потоках), в то время как NSOperation (в новом потоке) действительно требует ручного вызова цикла выполнения.

Почему для первого случая не требуется ручной вызов?

Ответы [ 3 ]

4 голосов
/ 04 марта 2011

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

Для получения более подробной информации о вызывающем абоненте, вам следует обратиться к документации для -[NSURLConnection scheduleInRunLoop:forMode:]. В нем объясняется, как вручную обрабатывать планирование и отмену планирования, и как NSURLConnections ведут себя в многопоточной среде.

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

0 голосов
/ 15 августа 2013

Если вы хотите запустить NSURLConnection в другом потоке, вы должны создать цикл выполнения, подобный этому, в основном методе вашего потока:

while (!finished)
{
  [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1]];
}
0 голосов
/ 04 марта 2011

Поскольку основной поток уже имеет цикл выполнения, я бы вообразил.

...