NSTimer не работает без UIApplication? - PullRequest
3 голосов
/ 18 июля 2010

У меня есть специальное приложение для iPhone, которое никак не зависит от UIKit (оно не связано с UIKit).Это означает, что я не использую UIApplication и, следовательно, не вызываю UIApplicationMain .

. Проблема в том, что при создании таймера он никогда не срабатывает.Таймер создается следующим образом:

[NSTimer timerWithTimeInterval:10 target:self selector:@selector(updateTime) userInfo:nil repeats:TRUE];

Я подозреваю, что проблема может быть связана с циклом выполнения, так как после того, как я закончу базовую инициализацию в " main () ", я делаю это:

NSLog(@"Starting application ...");
applicationInstance = [MyApp alloc];
[applicationInstance setMainLayer:mainLayer];
[NSThread detachNewThreadSelector:@selector(runApplication) toTarget:applicationInstance withObject:nil];

CFRunLoopRun();

Я перепроектировал UIKit и заметил, что UIApplication делает гораздо больше, чем регистрация системных событий и т. Д. NSTimer может полагаться на одну из этих вещей.Еще я заметил, что в делегате UIApplication поток такой же, как в main ().

Как мне заставить NSTimer работать правильно?Если это связано с циклом выполнения, может кто-то указать на ошибку?« CFRunLoopRun () » используется для отключения основного потока, чтобы остальная часть приложения могла работать.Я не думаю, что это правильно.

Редактировать: Я думаю, что цикл запуска должен быть настроен.Как-то ...

Ответы [ 2 ]

4 голосов
/ 18 июля 2010

Ваша проблема определенно связана с циклом;см. ссылку NSTimer , в частности, введение:

Таймеры работают в сочетании с циклами выполнения.Для эффективного использования таймера вы должны знать, как работают циклы выполнения - см. NSRunLoop и Руководство по программированию потоков .В частности, обратите внимание, что циклы выполнения сохраняют свои таймеры, поэтому вы можете освободить таймер после добавления его в цикл выполнения.

3 голосов
/ 19 июля 2010

Решение было довольно простым

NSTimer * timeUpdateTimer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(updateTime) userInfo:nil repeats:TRUE]; 
[[NSRunLoop mainRunLoop] addTimer:timeUpdateTimer forMode:NSDefaultRunLoopMode];

Спасибо за совет Лохматая лягушка

...