2010-07-18 4 views
3

У меня есть приложение для iPhone, которое не полагается на UIKit каким-либо образом (оно не связано с UIKit). Это означает, что я не использую UIApplication и поэтому не звонил UIApplicationMain.NSTimer не работает без UIApplication?

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

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

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

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()" используется, чтобы повесить основной поток, чтобы остальная часть приложения могла работать. Я не думаю, что это правда.

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

ответ

4

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

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

+0

Так как я получить его на работу? Я действительно запутался прямо сейчас –

+0

Вы ознакомились с руководством по программированию? Раздел «Использование циклов запуска»? Раньше я еще не создал свою собственную Run Loop, но мне кажется, что это хорошее место для начала! –

+0

Да, да. Он не предоставил никакой информации :( –

3

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

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

Спасибо за кончик Shaggy Frog

Смежные вопросы