NSTimer不会因无效而停止

时间:2013-09-11 15:21:55

标签: ios nstimer invalidation

我添加这样的计时器

tim=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(repeatTim) userInfo:nil repeats:YES];
[[NSRunLoop mainRunLoop] addTimer:tim forMode:NSDefaultRunLoopMode];

tim 这是我班级的NSTimer属性。

然后我点击按钮点击

[[fbt tim] invalidate];
[fbt setTim:nil];

fbt它是我班级的实例。

如果我只调用invalidate然后它不会停止,但是如果我将它设置为nil然后我得到了EXC_BREAKPOINT

这里是选择器

中的repeatTim方法的代码
AppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
[appDelegate.wbv stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"intal()"]];

我试图在

中调用 init 无效
dispatch_async(dispatch_get_main_queue(), ^{})

它也不会停止计时器。

3 个答案:

答案 0 :(得分:5)

您有多个计时器正在运行。试试这个:

-(void)startTimer{
    [self.myTimer invalidate]; // kill old timer
    self.myTimer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(doSomething) userInfo:nil repeats:YES];
}

-(void)stopTimer{
    [self.myTimer invalidate];  
    self.myTimer=nil; //set pointer to nil 
}

答案 1 :(得分:4)

阅读NSTimer的文档:

  

创建计时器有三种方法:

     
      
  1. 使用scheduledTimerWithTimeInterval:invocation:repeats:或scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:class方法创建计时器并在默认模式下在当前运行循环上安排它。

  2.   
  3. 使用timerWithTimeInterval:invocation:repeats:或timerWithTimeInterval:target:selector:userInfo:repeats:class方法创建计时器对象而不在运行循环上安排它。 (创建它之后,必须通过调用相应NSRunLoop对象的addTimer:forMode:方法手动将计时器添加到运行循环中。)

  4.   
  5. 分配计时器并使用initWithFireDate初始化它:interval:target:selector:userInfo:repeats:method。 (创建它之后,必须通过调用相应NSRunLoop对象的addTimer:forMode:方法手动将计时器添加到运行循环中。)

  6.   

您使用的方法已经将其从1添加到mainLoop。 - 您需要删除此行或使用2.方法创建计时器并保留手动添加。

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

答案 2 :(得分:0)

我已经尝试了找到的所有可能的解决方案,但最终无法解决这个问题,我在初始化如下定时器时设置了重复“假”

self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(viewcontroller.methodname), userInfo: nil, repeats: false)

并且需要在我的选择器方法中添加以上行,以用于我想要重复时间的任何条件。

例如:- 我的要求是我想重复调用某个方法,直到满足一个条件。因此,我没有添加重复 true,而是将其设置为 false,因为在我的情况下,repeat true 不会使计时器失效。

我在我的 viewdidload 方法中添加了以下内容

self.timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(viewcontroller.method), userInfo: nil, repeats: false)

在选择器函数中我添加了以下代码:-

func method{
   if condition matched{
        // here your timer will be invalidated automatically
   }
   else{
       self.timer = Timer.scheduledTimer(timeInterval: 1, target: self,selector: #selector(viewcontroller.method), userInfo: nil,repeats: false)
   }
}

希望这能解决您的问题。

快乐编码:)