Для игры, которую я разрабатываю, я вызываю дорогой метод из одной из процедур сенсорной обработки. Чтобы сделать это быстрее, я решил использовать performSelectorInBackgroundThread
, поэтому вместо:
[gameModel processPendingNotifications];
Я перешел на:
[gameModel performSelectorInBackground:@selector(processPendingNotifications) withObject:nil];
Первая проблема, с которой я столкнулся, это то, что у processPendingNotifications
не было NSRunLoop
, поэтому я добавил его следующим образом:
- (void)processPendingNotifications {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[pendingNotificationsQueue makeObjectsPerformSelector:@selector(main)];
[pendingNotificationsQueue removeAllObjects];
[pool drain];
}
Пока все хорошо. Моя проблема заключается в том, что некоторые методы, вызываемые из этого фонового потока, создают новые NSTimer
экземпляры. Эти случаи заканчиваются тем, что не стреляют. Я думаю, это потому, что у вторичного потока, который у меня есть, нет (или он заканчивается) NSRunLoop
. Я запускаю новые таймеры с помощью:
[NSTimer scheduledTimerWithTimeInterval:20.0 target:self selector:@selector(timerFired) userInfo:nil repeats:NO];
Мои вопросы:
- Правильно ли я подозреваю, что проблема связана с
NSRunLoop
?
- Можно ли запустить
NSTimer
из фонового потока и прикрепить его к основному потоку NSRunLoop
?