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