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:] из другого потока. Тем не менее, мой совет остается в силе.

Другие вопросы по тегам