iOS开发中解决UIScrollView滚动时NSTimer失效的问题

我不知道大家在使用NSTimer的时候有没有发现如果我们滑动ScrollView,NSTimer就会失效。我曾经遇到过这样的问题,但需求是即使滑动scrollView,NSTimer也不能失效,于是就好好地研究了下这个问题。最终发现是NSTimer选择的一个模式的问题。

代码:

[[NSRunLoopcurrentRunLoop] addTimer:self.timerforMode:NSDefaultRunLoopMode];

我们将timer添加到当前的主线程中,并且选择 NSDefaultRunLoopMode这个默认的模式。在选择这个默认的模式之后,如果我们不与UI进行交互那么NSTimer是有效的,如果我们与UI进行交互那么主线程runloop就会转到 UITrackingRunLoopMode模式下,不能处理定时器,从而定时器失效。

让定时器不失效的方式有两种:1.改变runloop的模式(NSRunLoopCommonModes),无论用户是否与UI进行交互主线程的runloop都能处理定时器。2.开启一个新的线程,让定时器在新的线程中进行定义,这时定时器就会被子线程中的runloop处理。

代码:

改变runloop的模式:

 self.timer = [NSTimertimerWithTimeInterval:1.0target:selfselector:@selector(updateTimer)userInfo:nilrepeats:YES];

    

    // 添加到运行循环  NSRunLoopCommonModes:占位模式  主线程

    [[NSRunLoopcurrentRunLoop] addTimer:self.timerforMode:NSRunLoopCommonModes]; // 如果不改变Mode模式在滑动屏幕的时候定时器就不起作用了


在子线程中定义定时器:

 [NSThreaddetachNewThreadSelector:@selector(bannerStart)toTarget:selfwithObject:nil];


// 在子线程中定义定时器

- (void)bannerStart{

    self.timer = [NSTimerscheduledTimerWithTimeInterval:1target:selfselector:@selector(updateTimer)userInfo:nilrepeats:YES];

    [[NSRunLoopcurrentRunLoop] addTimer:self.timerforMode:NSDefaultRunLoopMode];

    [[NSRunLoopcurrentRunLoop] run];

}

- (void)updateTimer

{

    NSLog(@"当前线程:%@",[NSThread currentThread]);

    NSLog(@"启动RunLoop--%@",[NSRunLoop currentRunLoop].currentMode);

    NSLog(@"currentRunLoop:%@",[NSRunLoop currentRunLoop]);

    dispatch_async(dispatch_get_main_queue(), ^{

        self.count ++;

        NSString *timerText = [NSString stringWithFormat:@"计时器:%ld",self.count];

        self.timerLabel.text = timerText;

    });

}





  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值