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];

你可能感兴趣的:(NSTimer在UITableView中使用的误差)