NSTimer setFireDate - PullRequest
       76

NSTimer setFireDate

1 голос
/ 26 мая 2011

Считается ли потокобезопасным для вызова 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 ]

3 голосов
/ 26 мая 2011

Примечание из NSTimer ссылки для метода setFireDate: гласит:

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

Также посмотрите, поможет ли следующее Обсуждение .

2 голосов
/ 26 мая 2011

Почему бы не запустить таймер в главном потоке? Я не понимаю, почему вам нужно запустить его в отдельном потоке. Вы всегда можете использовать timerFireMethod: создавать новый поток, если он занимает много времени, просто запустите соответствующий метод с помощью performSelectorInBackground:withObject:.

РЕДАКТИРОВАТЬ: Таким образом, документация фактически говорит о том, что не является потокобезопасным для вызова [timer setFireDate:] из другого потока. Однако мой совет остается в силе.

...