NSTimer setFireDate
Считается ли потокобезопасным для вызова setFireDate: из другого потока, чем тот, в котором запланирован таймер? Я имею в виду, я отключаю эту функцию в новой теме:
-(void)CFRunLoopTest {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
timer = [NSTimer timerWithTimeInterval:1 target:self selector:@selector(timerFireMethod:) userInfo:nil repeats:YES];
runLoop = CFRunLoopGetCurrent();
CFRunLoopAddTimer(runLoop, (CFRunLoopTimerRef)timer, kCFRunLoopCommonModes);
CFRunLoopRun();
[pool drain];
}
Можно мне позвонить [timer setFireDate:]
из основного потока? Я не нашел ничего в документации, которая запрещает это...
2 ответа
Примечание от ссылки NSTimer для setFireDate:
метод говорит
Вы можете потенциально вызвать этот метод на неповторяющемся таймере, который еще не сработал, хотя вы всегда должны делать это из потока, к которому подключен таймер, чтобы избежать возможных состояний гонки.
Также посмотрите, поможет ли следующее обсуждение.
Почему бы не запустить таймер в главном потоке? Я не понимаю, почему вам нужно запустить его в отдельном потоке. Вы всегда можете использовать timerFireMethod: создавать новый поток, если он занимает много времени, просто запустите соответствующий метод с помощью performSelectorInBackground:withObject:
,
РЕДАКТИРОВАТЬ: Таким образом, документация на самом деле говорит, что это не безопасно поток вызова[timer setFireDate:]
из другого потока. Тем не менее, мой совет остается в силе.