从其调用方法中使NSTimer无效

时间:2012-05-15 10:06:13

标签: objective-c ios multithreading nstimer

我已经使用[NSTimer scheduledTimerWithTimeInterval: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];
    }
}

这是允许的吗?文档说明

  

您必须从安装了计时器的线程发送此消息。如果从另一个线程发送此消息,则与该计时器关联的输入源可能不会从其运行循环中删除,这可能会阻止该线程正常退出。

如果这不是完成此任务的正确方法:正确的方法是什么?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:3)

可以从被触发的方法中使它无效,因为被触发的方法与计划定时器的同一个线程在一起:

  

scheduledTimerWithTimeInterval:目标:选择器:USERINFO:重复:

     

创建并返回一个新的NSTimer对象,并在默认模式下在当前运行循环上安排它。