планирование асинхронных загрузок в runloop основного потока против runlop потока bg на iOS? - PullRequest
0 голосов
/ 17 августа 2010

Вот слайд из сеанса WWDC 2010 208:

conn = [[NSURLConnection alloc] initWithRequest:req
  delegate:self startImmediately:NO];
[conn scheduleInRunLoop: [NSRunLoop currentRunLoop]
  forMode: NSDefaultRunLoopMode];
[conn start];

Существуют ли проблемы, связанные с добавлением нескольких conn в currentRunLoop?

Какие преимущества дает планирование NSURLConnection в фоновом потокеrunloop?

Спасибо!

1 Ответ

2 голосов
/ 17 августа 2010

Использование фразы «вторичный цикл выполнения» предполагает, что вы не знаете, что такое цикл выполнения.

NSRunLoop является реализацией «основного цикла» потока.Более или менее,

while ([runLoop waitNextEvent]) {
    NSAutoreleasePool * pool = [NSAutoreleasePool new];
    [runLoop handleEvent];
    [pool release]; pool = nil;
}

В цикле выполнения есть поток.Каждый поток имеет не более одного цикла выполнения.«executeSelectorOnMainThread» планирует это в цикле выполнения, но программисты обычно говорят о потоках, а не о том, какую абстракцию цикла выполнения он использует, поскольку они все одинаковые.Не все потоки имеют циклы выполнения (функции NSThread обычно дают вам поток без цикла выполнения; я думаю, что вам нужно создать цикл выполнения самостоятельно, если вы этого хотите).

«currentRunLoop» - это цикл выполнениятекущий исполняемый поток.Это вероятно основной поток, если вы не использовали NSOperation / dispatch _ * / и т.д.Если вы запланируете это в другом потоке, то (я думаю) обратные вызовы делегата будут запущены из другого потока.Вы, вероятно, не хотите, чтобы это произошло.

Теперь, потоки.

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

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

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

(И пока iPhone не станет двухъядерным, он почти наверняка не понадобится для 99% кода, который вы пишете.)

...