1

[NSTimerscheduledTimerWithTimeInterval:target:selector:userInfo:] を使用してタイマーをスケジュールしましたが、起動した時点で無効にしたいと考えています。

- (id)init
{
    [NSTimer scheduledTimerWithInterval:1 target:self selector:@selector(fired:) userInfo:nil repeats:YES];
}

- (void)fired:(NSTimer *)timer
{
    if (someCondition) {
        [timer invalidate];
    }
}

これは許されますか?ドキュメントの状態

このメッセージは、タイマーがインストールされたスレッドから送信する必要があります。このメッセージを別のスレッドから送信すると、タイマーに関連付けられた入力ソースが実行ループから削除されず、スレッドが正常に終了できなくなる可能性があります。

これがこのタスクを達成するための適切な方法でない場合: 適切な方法は何ですか?

4

2 に答える 2

5

fire メソッド内からの呼び出し[timer invalidate]は問題ありません。そのコードは、タイマーを作成したときに使用したスレッドと同じスレッドで実行されます。

引用したApple Docは、別のスレッドを作成してそこからタイマーを無効にすると、予測できない動作が予想されることを警告するだけです。

元。

// Create the background queue
dispatch_queue_t queue = dispatch_queue_create("do not do this", NULL);

// Start work in new thread
dispatch_async(queue, ^ { 

         // !! do not do this  !!
         if (someCondition) {
                 [yourTimer invalidate];
         }
         // or this
         [self fire:yourTimer];
});

// won’t actually go away until queue is empty
dispatch_release(queue);
于 2012-05-15T10:22:00.623 に答える
3

起動されたメソッドは、タイマーがスケジュールされたスレッドと同じスレッド上にあるため、起動されたメソッドから無効化しても問題ありません。

ScheduledTimerWithTimeInterval:target:selector:userInfo:repeats:

新しい NSTimer オブジェクトを作成して返し、デフォルト モードで現在の実行ループにスケジュールします。

于 2012-05-15T10:15:07.337 に答える