1

タイマーがスケジュールされているスレッドとは別のスレッドから 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:]メインスレッドから呼び出してもいいですか? それを禁止するドキュメントには何も見つかりませんでした...

4

2 に答える 2

3

メソッドのNSTimerリファレンスからのメモには、setFireDate:

このメソッドは、まだ起動していない非繰り返しタイマーで呼び出すことができますが、 潜在的な競合状態を回避するために、タイマーがアタッチされているスレッドから常に呼び出す必要があります。

また、次の ディスカッションが役立つかどうかも確認してください。

于 2011-05-26T11:47:33.710 に答える
2

メインスレッドでタイマーを実行してみませんか? 別のスレッドで実行する必要がある理由がわかりません。常に timerFireMethod を持つことができます: 多くの時間を消費する場合は、新しいスレッドを生成します. で適切なメソッドを実行するだけperformSelectorInBackground:withObject:です.

編集:ドキュメントには、実際には[timer setFireDate:]、別のスレッドから呼び出すのはスレッドセーフではないと書かれています。しかし、私のアドバイスはまだ有効です。

于 2011-05-26T11:48:33.490 に答える