2014-01-31 4 views
0

У меня есть вопрос о том, как использовать NSRunLoop в потоке. В «Руководстве по программированию нитей» в Apple упоминается «что ваш код предоставляет операторы управления, используемые для реализации фактической части цикла цикла выполнения, другими словами, ваш код предоставляет цикл while или for, который управляет циклом запуска». поэтому, при использовании NSURLConnection для загрузки данных асинхронно в новом потоке, я пишу следующий код и он работает:Использование «while loop» или «for loop» для дисков NSRunLoop в потоке

... 
.... 
NSURLConnection* connection = [[NSURLConnection alloc] initWithRequest:request delegate:self startImmediately:NO]; 
[NSThread detachNewThreadSelector:@selector(downloadThread:) toTarget:self withObject:nil]; 
.... 
... 

селектор «downloadThread» является точкой входа новой нити, следующий код «downloadThread»:

- (int) downloadThread:(id)option { 
    BOOL ret; 
    [connection scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [connection start]; 
    while (finished == NO) { 
     ret = [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
    } 
    return 1; 
} 

вот вопрос, NSRunLoop петля, почему мы должны с помощью оператора цикла «а (окончание == NO)» для управления NSRunLoop? даже если упоминание документа яблока, но я просто не» Т понять. в другой стороны, при использовании таймера, нам не нужно заявление петли для управления NSRunLoop, и он работает, так же, как это:

... 
.... 
NSTimer* _timer = [NSTimer timerWithTimeInterval:1 target:object selector:@selector(timerFunc) userInfo:nil repeats:YES]; 
[[NSRunLoop currentRunLoop] addTimer:_timer forMode:NSDefaultRunLoopMode]; 
[_timer fire]; 
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]; 
.... 
... 

так, в какой ситуации мы должны использовать оператор цикла управления NSRunLoop?

+6

'NSURLConnection' делает все в фоновом режиме по умолчанию. Вам не нужен какой-либо этот код для его правильного использования. – rmaddy

ответ

0

Прочитано docs для -[NSRunLoop runMode:beforeDate:]. Этот метод возвращается после обработки одного входного источника. Поэтому, если вы хотите продолжать обрабатывать источники ввода до тех пор, пока не произойдет какое-либо конкретное событие, вам придется обходить его.

Я не уверен, откуда пришел этот код таймера, но нет гарантии, что вызов -runMode:beforeDate: один раз позволит запустить таймер. Кроме того, -runMode:beforeDate: не вернется только потому, что таймер выстрелил. Итак, этот код кажется неправильным, по крайней мере, для меня.