NSTimer未按预期运行

时间:2013-01-07 23:19:23

标签: iphone objective-c ios nstimer

我希望这是一个简单的修复,你告诉我。

我所拥有的是NSTimer类型的IVAR *类计时器。执行IBAction时,会调用包含以下代码的方法:

if (timer) timer = nil;
timer = [NSTimer timerWithTimeInterval:0.2 target:self selector:@selector(removeOverlay) userInfo:nil repeats:NO];

在同一个班级,我有一个方法:

- (void)removeOverlay {
...
}

在.2秒的时间间隔后不会被触发。

你可能知道这里有什么问题吗?

4 个答案:

答案 0 :(得分:2)

  1. 确保同时不释放timer NSTimer的实例。
  2. removeOverlay看起来更新了一些用户界面。你可以在主线上调用它。
  3. removeLayout方法中放置断点以查看它是否会触发。
  4. 您没有安排计时器。将timerWithTimeInterval替换为scheduledTimerWithTimeInterval
  5. 在主线程上执行代码(允许UI更新):

    - (void)removeOverlay {
      dispatch_async(dispatch_get_main_queue(), ^{
         // update ui
      });
    }
    

    更多关于Grand Central Dispatch (GCD)

答案 1 :(得分:1)

你需要

 [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];

定时器通过将调用放在运行循环中的适当位置来工作。

答案 2 :(得分:1)

由于没有人提到它,将计时器添加到运行循环的替代方法是使用fire方法:

[timer fire];

答案 3 :(得分:0)

如果仅在我使用[self performSelector:@selector(removeOverlay) afterDelay:(seconds you want to delay the use the method removeOverlay)];

后才会调用它