Я пытаюсь запустить длинную задачу в фоновом режиме на iPhone. Я начинаю это с performSelectorInBackground
. Я также создаю NSTimer
в главном потоке, чтобы проверить, все ли работает. Я ожидал, что таймер запустится, пока другой поток сделает это:
- (void)viewDidLoad
{
[super viewDidLoad];
[NSTimer scheduledTimerWithTimeInterval:0.1 target:self
selector:@selector(onTimerEvent:)
userInfo:nil repeats:YES];
[self performSelectorInBackground:@selector(lengthyMethod) withObject:nil];
NSLog(@"Here we go!");
}
- (void)onTimerEvent:(NSTimer *)timer
{
NSLog(@"timer!");
}
lenghtyMethod
выполняет множество задач, включая загрузку URL-адресов с использованием ASIHTTPRequest и т. Д.
Вывод NSLog
выглядит следующим образом:
2011-03-11 15:17:07.470 MyApp[6613:207] Here we go!
2011-03-11 15:17:07.570 MyApp[6613:207] timer!
2011-03-11 15:17:07.670 MyApp[6613:207] timer!
// ... several seconds of output from lenghtyMethod omitted ...
2011-03-11 15:17:11.075 MyApp[6613:207] timer!
2011-03-11 15:17:11.170 MyApp[6613:207] timer!
// ... etc ... timer runs as expected when the call is completed ...
Проблема в том, что фоновый поток, кажется, блокирует таймер . Насколько я понимаю, executeSelectorInBackground должен выполняться в новом потоке, отдельном от основного цикла.
Я не понимаю этого. Пока поток работает, я не получаю вывод от таймера После завершения вызова таймер снова начинает регистрироваться.
Что касается записи, поток в основном выполняет операции ввода-вывода (загрузки URL-адресов), поэтому у ОС должно быть достаточно времени для переключения потоков. Это происходит как в симуляторе, так и на реальном устройстве.