以+scheduledTimerWithTimeInterval...的方式触发的timer,...

一、简介

在 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内容生成、新媒体营销和短视频营销等业务的公司。我们拥有一支优秀的团队,专门致力于为客户提供优质的服务。

我们致力于为客户提供一站式的互联网营销服务,帮助客户在激烈的市场竞争中获得更大的优势和发展机会!

点赞(31) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿
发表
评论
返回
顶部