【问题标题】:Unable to invalidate timer无法使计时器无效
【发布时间】:2013-12-16 17:37:50
【问题描述】:

我正在尝试在我的应用程序中使用计时器,我想在 viewWillAppear 上启动计时器并希望在 viewWillDisappear 方法中停止它。我已经完成了以下编码:
在.h中: @property (nonatomic, strong) NSTimer *timer;

-(void)viewWillAppear:(BOOL)animated{
   [super viewWillAppear:FALSE];
   if(!_timer){
     _timer = [NSTimer scheduledTimerWithTimeInterval: 5.0
                                              target: self
                                            selector:@selector(reloadInboxMessages)
                                            userInfo: nil repeats:YES];
  }
}

-(void)reloadInboxMessages {
  NSLog(@"reloadInboxMessages");
  [tblvwMessage reloadData];
 }

-(void)viewWillDisappear:(BOOL)animated {
   [super viewWillDisappear:FALSE];

   NSLog(@"viewWillDisappear");
   if([_timer isValid]){
       [_timer invalidate];
       _timer = nil;
   }
}

我认为这将是一项简单的任务,但我不确定为什么它不起作用。有什么问题?

【问题讨论】:

  • 用 NSLog 检查你的代码是否输入:if([_timer isValid])
  • “不工作”是什么意思?计时器是在不应该触发的时候触发,还是在应该触发的时候没有触发,还是其他原因?
  • 您的代码对我来说很好用。你是说你离开这个控制器后继续看到日志“reloadInboxMessages”?
  • 我测试了您的代码(注释 "[tblvwMessage reloadData]" 行)并且工作正常。计时器在视图消失时停止,并在视图出现时重新启动。
  • 为了更详细地说明@rdelmar 的问题,您是说您可以在 invalidate 上使用 NSLog,在 reload 方法上使用 NSLog,并且在 after 之后出现重新加载日志消息无效?

标签: ios iphone objective-c nstimer


【解决方案1】:

尝试 self.timer = [NSTimer scheduledTimerWithTimeInterval ...

【讨论】:

    【解决方案2】:

    创建定时器的方法有以下三种:

    使用scheduledTimerWithTimeInterval:invocation:repeats: 或scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: 类方法创建定时器并在默认模式下将其调度到当前运行循环中。

    使用 timerWithTimeInterval:invocation:repeats: 或 timerWithTimeInterval:target:selector:userInfo:repeats: 类方法来创建计时器对象,而无需在运行循环中调度它。 (创建完成后,必须手动将定时器添加到运行循环中,方法是调用对应NSRunLoop对象的addTimer:forMode:方法。)

    分配计时器并使用 initWithFireDate:interval:target:selector:userInfo:repeats: 方法对其进行初始化。 (创建完成后,必须手动将定时器添加到运行循环中,方法是调用对应NSRunLoop对象的addTimer:forMode:方法。)

    编辑:

    您正在使用已将其添加到 mainLoop 的方法 - 使用第二种方法创建计时器并保留手动添加。

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

    编辑:

    使回调中传递的计时器无效,但不会在 viewWillDisappear 方法中发生:。因此,它并不完全适用于这种情况:

    • (void)onTimer:(NSTimer *)pTimer { [pTimer 无效]; }

    希望对你有帮助。

    【讨论】:

    • 这是不正确的。您当然可以使使用 OP 使用的方法创建的计时器无效。
    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多