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;這兩著用什么區(qū)別了,請看下面解釋。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;
    是不用添加的他會默認(rèn)的自動添加。

下面就講講NSTimer在UITableView中的誤差
看實(shí)例
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(@"這里進(jìn)了多少次");
    }
    return cell;
    }
  • (void)addTimer {
    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(test) userInfo:nil repeats:YES];
    }

  • (void)test {
    NSLog(@"有沒有進(jìn)入時間");
    }運(yùn)行結(jié)果:oooooo```

2016-10-11 11:14:53.760 gcd[246:11102] ****這里進(jìn)了多少次
2016-10-11 11:14:53.762 gcd[246:11102] ****這里進(jìn)了多少次
2016-10-11 11:14:53.763 gcd[246:11102] ****這里進(jìn)了多少次
2016-10-11 11:14:53.764 gcd[246:11102] ****這里進(jìn)了多少次
2016-10-11 11:14:53.764 gcd[246:11102] ****這里進(jìn)了多少次
2016-10-11 11:14:53.765 gcd[246:11102] ****這里進(jìn)了多少次
2016-10-11 11:14:55.214 gcd[246:11102] ****這里進(jìn)了多少次
2016-10-11 11:14:55.246 gcd[246:11102] ****這里進(jìn)了多少次
2016-10-11 11:14:55.337 gcd[246:11102] ****這里進(jìn)了多少次
2016-10-11 11:14:58.608 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:14:58.609 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:14:58.609 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:14:58.610 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:14:58.610 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:14:58.611 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:14:58.611 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:14:58.611 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:14:58.612 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:14:59.215 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:14:59.248 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:14:59.339 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:14:59.761 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:14:59.762 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:14:59.763 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:14:59.764 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:14:59.765 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:14:59.765 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:15:01.219 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:15:01.251 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:15:01.343 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:15:01.765 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:15:01.766 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:15:01.767 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:15:01.768 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:15:01.769 gcd[246:11102] ****有沒有進(jìn)入時間
2016-10-11 11:15:01.769 gcd[246:11102] ****有沒有進(jìn)入時間相隔都1s左右這和我們的實(shí)際要求是不服的。 那下面是放在UITableView結(jié)果:oooooo```

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

  • (void)test {
    NSLog(@"有沒有進(jìn)入時間");
    }結(jié)果:oooooo**2016-10-11 11:11:33.610 gcd[233:10089] ****有沒有進(jìn)入時間** **2016-10-11 11:11:35.609 gcd[233:10089] ****有沒有進(jìn)入時間** **2016-10-11 11:11:37.609 gcd[233:10089] ****有沒有進(jìn)入時間** **2016-10-11 11:11:39.610 gcd[233:10089] ****有沒有進(jìn)入時間**
    這種就沒有誤差

總結(jié):
方式1會自動將創(chuàng)建的定時器以默認(rèn)方式添加到當(dāng)前線程runloop中,而無需手動添加。但是在此種模式下,當(dāng)滾動屏幕時runloop會進(jìn)入另外一種模式,定時器會暫停,為了解決這種問題,可以像方式2那樣把定時器添加到NSRunLoopCommonModes模式下。
方式1和方式2在設(shè)置后都會在間隔設(shè)定的時間(本例中設(shè)置為2s)后執(zhí)行test方法,如果需要立即執(zhí)行可以使用下面的代碼。
[time fire];

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容