NSTimer在UITableView中使用的误差

NSTimer的使用一般有两种:
oooooo

  • (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;
    +(NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;这两着用什么区别了,请看下面解释。oooooo+(NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;
    需要将定时器添加到runloop中,否则定时器是不会启动。
    oooooo
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];oooooo+(NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;
    是不用添加的他会默认的自动添加。

下面就讲讲NSTimer在UITableView中的误差
看实例
oooooo

  • (instancetype)initTableView:(UITableView *)tableView {
    static NSString *ID = @"cell";
    TableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
    if (cell == nil) {
    cell = [[TableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:ID];
    [cell addTimer];
    NSLog(@"这里进了多少次");
    }
    return cell;
    }
  • (void)addTimer {
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(test) userInfo:nil repeats:YES];
    }

  • (void)test {
    NSLog(@"有没有进入时间");
    }运行结果:oooooo```

2016-10-11 11:14:53.760 gcd[246:11102] ****这里进了多少次
2016-10-11 11:14:53.762 gcd[246:11102] ****这里进了多少次
2016-10-11 11:14:53.763 gcd[246:11102] ****这里进了多少次
2016-10-11 11:14:53.764 gcd[246:11102] ****这里进了多少次
2016-10-11 11:14:53.764 gcd[246:11102] ****这里进了多少次
2016-10-11 11:14:53.765 gcd[246:11102] ****这里进了多少次
2016-10-11 11:14:55.214 gcd[246:11102] ****这里进了多少次
2016-10-11 11:14:55.246 gcd[246:11102] ****这里进了多少次
2016-10-11 11:14:55.337 gcd[246:11102] ****这里进了多少次
2016-10-11 11:14:58.608 gcd[246:11102] ****有没有进入时间
2016-10-11 11:14:58.609 gcd[246:11102] ****有没有进入时间
2016-10-11 11:14:58.609 gcd[246:11102] ****有没有进入时间
2016-10-11 11:14:58.610 gcd[246:11102] ****有没有进入时间
2016-10-11 11:14:58.610 gcd[246:11102] ****有没有进入时间
2016-10-11 11:14:58.611 gcd[246:11102] ****有没有进入时间
2016-10-11 11:14:58.611 gcd[246:11102] ****有没有进入时间
2016-10-11 11:14:58.611 gcd[246:11102] ****有没有进入时间
2016-10-11 11:14:58.612 gcd[246:11102] ****有没有进入时间
2016-10-11 11:14:59.215 gcd[246:11102] ****有没有进入时间
2016-10-11 11:14:59.248 gcd[246:11102] ****有没有进入时间
2016-10-11 11:14:59.339 gcd[246:11102] ****有没有进入时间
2016-10-11 11:14:59.761 gcd[246:11102] ****有没有进入时间
2016-10-11 11:14:59.762 gcd[246:11102] ****有没有进入时间
2016-10-11 11:14:59.763 gcd[246:11102] ****有没有进入时间
2016-10-11 11:14:59.764 gcd[246:11102] ****有没有进入时间
2016-10-11 11:14:59.765 gcd[246:11102] ****有没有进入时间
2016-10-11 11:14:59.765 gcd[246:11102] ****有没有进入时间
2016-10-11 11:15:01.219 gcd[246:11102] ****有没有进入时间
2016-10-11 11:15:01.251 gcd[246:11102] ****有没有进入时间
2016-10-11 11:15:01.343 gcd[246:11102] ****有没有进入时间
2016-10-11 11:15:01.765 gcd[246:11102] ****有没有进入时间
2016-10-11 11:15:01.766 gcd[246:11102] ****有没有进入时间
2016-10-11 11:15:01.767 gcd[246:11102] ****有没有进入时间
2016-10-11 11:15:01.768 gcd[246:11102] ****有没有进入时间
2016-10-11 11:15:01.769 gcd[246:11102] ****有没有进入时间
2016-10-11 11:15:01.769 gcd[246:11102] ****有没有进入时间相隔都1s左右这和我们的实际要求是不服的。 那下面是放在UITableView结果:oooooo```

  • (void)addTimer {
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(test) userInfo:nil repeats:YES];
    }

  • (void)test {
    NSLog(@"有没有进入时间");
    }结果:oooooo**2016-10-11 11:11:33.610 gcd[233:10089] ****有没有进入时间** **2016-10-11 11:11:35.609 gcd[233:10089] ****有没有进入时间** **2016-10-11 11:11:37.609 gcd[233:10089] ****有没有进入时间** **2016-10-11 11:11:39.610 gcd[233:10089] ****有没有进入时间**
    这种就没有误差

总结:
方式1会自动将创建的定时器以默认方式添加到当前线程runloop中,而无需手动添加。但是在此种模式下,当滚动屏幕时runloop会进入另外一种模式,定时器会暂停,为了解决这种问题,可以像方式2那样把定时器添加到NSRunLoopCommonModes模式下。
方式1和方式2在设置后都会在间隔设定的时间(本例中设置为2s)后执行test方法,如果需要立即执行可以使用下面的代码。
[time fire];

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容