一、简介
在 iOS 开发中,我们经常需要实现定时器功能,比如在特定时间间隔内重复执行某个任务或者执行定时任务等。在使用定时器时,需要考虑到定时器的生命周期管理和性能优化。在 iOS 中,就有两种方式实现定时器功能,一种是使用GCD定时器(dispatch_source_t),另一种就是使用NSTimer定时器。
NSTimer 定时器是属于 Foundation 框架的一部分,用于在未来某个时间点执行任务,并可以设置周期。NSTimer定时器有三种创建方式:
1. +scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:,该方法将创建一个自启动的定时器,且默认加到当前运行循环中,在指定时间间隔内执行target指定的方法。
2. -initWithFireDate: interval: target: selector: userInfo: repeats:,该方法需要手动加到运行循环中,会在指定的fireDate时间点开始执行target指定的方法,然后每隔interval指定的时间间隔再次执行,如果repeats为YES,就重复执行,如果repeats为NO,只执行一次。
3. +timerWithTimeInterval: target: selector: userInfo: repeats:,和上面的+scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:方法类似,也是创建一个自启动的定时器,但是不会将定时器加入运行循环中,而是需要我们手动调用-addToRunLoop:forMode:方法,将其加到指定的运行循环中。
在本文中,我们将主要介绍第一种 +scheduledTimerWithTimeInterval: target: selector: userInfo: repeats: 的方式创建 NSTimer 定时器的使用方法,及其案例说明。
二、方法定义
+(NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval
target:(id)target
selector:(SEL)selector
userInfo:(nullable id)userInfo
repeats:(BOOL)repeats;
该方法返回一个自启动的 NSTimer 实例对象,NSTimer 实例对象被自动加入到主运行循环中,周期性地调用 target 的 selector 方法,间隔时间为 interval ,直到定时器被invalidate停止。
参数列表:
1. interval:指定多长时间间隔调用一次 selector 方法(单位为秒)。
2. target:需要调用 selector 方法的对象。
3. selector:需要重复调用的方法,调用者需要有参数为 NSTimer * 的方法,例如:
- (void)timerFired:(NSTimer *)timer;
4. userInfo:传入selector方法的参数,可以传nil。
5. repeats:指定定时器循环调用 selector 方法的次数。如果该参数为 YES,那么定时器会周期性地调用 selector 方法,直到调用invalidate方法将定时器停止。如果该参数为NO,那么定时器调用 selector 方法一次后就停止。
三、使用方法
+(NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval target:(id)target
selector:(SEL)selector userInfo:(nullable id)userInfo repeats:(BOOL)repeats;
使用该方法创建时间时,调用者 可以选择每次调用selector方法时是否要传递参数,如果设置了 userInfo 参数,定时器调用 selector 方法时则会传递这个 userInfo 参数。
在开始运行一个 NSTimer 实例对象之前,我们必须先把它加入到 run loop 中,这样 run loop 才能周期性自动调用它的回调方法。
例如,在 viewDidLoad 方法中创建一个自启动的 NSTimer 定时器,每隔一秒钟向控制台输出当前时间,可以这样写:
```
- (void)viewDidLoad {
[super viewDidLoad];
//创建一个定时器初使化自启动
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(printMsg) userInfo:nil repeats:YES];
}
- (void)printMsg {
NSLog(@"%@", [NSDate date]); //输出当前时间
}
```
当定时器启动后,每隔1秒钟输出当前时间,直到应用程序退出或者调用了该定时器的-invalidate方法,例如:
```
- (void)dealloc {
[self.timer invalidate]; //在 UIViewController 销毁时停止定时器
}
```
四、案例说明
1. 定时更新UI
在实际开发中,经常需要定期更新UI中的某些内容,比如计时器的更新。使用 NSTimer 可以很方便地实现此功能。
例如在一个游戏中,需要定时更新UI中的分数,可以这样写:
```
- (void)viewDidLoad {
[super viewDidLoad];
self.score = 0;
self.scoreLabel.text = @"0";
//创建一个定时器初使化自启动
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateScore) userInfo:nil repeats:YES];
}
- (void)updateScore {
self.score++;
self.scoreLabel.text = [NSString stringWithFormat:@"%d", self.score];
}
```
2. 计时器功能的实现
定时器功能的实现,已经是 iOS 开发中的一个经典案例了。下面就是一个比较经典的计时器功能的实现:
```
- (void)viewDidLoad {
[super viewDidLoad];
self.seconds = 0;
//创建一个定时器初使化自启动
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(startTiming) userInfo:nil repeats:YES];
}
- (void)startTiming {
self.seconds++;
self.timeLabel.text = [NSString stringWithFormat:@"%d", self.seconds];
}
```
在上面的代码中,我们创建了一个自启动的 NSTimer 定时器,每隔1秒钟更新计步器的时间,即 startTiming 方法,直到定时器停止。
定时器停止的代码实现:
```
[self.timer invalidate]; //停止定时器
```
在上述两个案例中,我们看到了NSTimer定时器的使用方法,我们也可以使用NSTimer定时器实现很多其它功能。
五、注意事项
1. 使用NSTimer时,必须将其加入到运行循环中,否则定时器将不会工作。
2. 正确处理定时器的生命周期,确保定时器的及时释放,避免造成内存泄漏。
3. 定时器可以运行在不同的 run loop mode 下,可以使用-addTimer:forMode:方法将定时器加入到指定的 mode下。在 mode 发生改变时,为了确保定时器可以继续运行,也需要更新定时器加入的 run loop mode。
到此,关于NSTimer 的使用方法及案例说明已经介绍完毕。使用 NSTimer 定时器可以很方便地实现定时任务,但是也需要注意定时器的生命周期,确保定时器及时释放,避免对内存的占用过大。
壹涵网络我们是一家专注于网站建设、企业营销、网站关键词排名、AI内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。
我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!
发表评论 取消回复