iOS中最全的各种定时器使用教程

2020-01-21 00:59:16于丽

输出:


2016-12-29 16:52:54.029 定时器[12089:289673] 0---<__NSCFTimer: 0x60000017d940>
2016-12-29 16:52:54.029 定时器[12089:289673] start
2016-12-29 16:52:55.104 定时器[12089:289673] 1---<__NSCFTimer: 0x60000017d940>
2016-12-29 16:52:56.095 定时器[12089:289673] 2---<__NSCFTimer: 0x60000017d940>
2016-12-29 16:52:57.098 定时器[12089:289673] 3---<__NSCFTimer: 0x60000017d940>
2016-12-29 16:52:58.094 定时器[12089:289673] 4---<__NSCFTimer: 0x60000017d940>

可以看出, 这里定时器是立马就执行了, 没有延迟;

此方法可以传递多个参数, 下面是传递两个参数的示例:


// NSInvocation形式
- (void)timer2 {
 
 NSMethodSignature *method = [ViewController instanceMethodSignatureForSelector:@selector(invocationTimeRun:des:)];
 
 NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:method];
 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 invocation:invocation repeats:YES];
 
 // 设置方法调用者
 invocation.target = self;
 
 // 这里的SEL需要和NSMethodSignature中的一致
 invocation.selector = @selector(invocationTimeRun:des:);
 
 // 设置参数
 // //这里的Index要从2开始,以为0跟1已经被占据了,分别是self(target),selector(_cmd)
 // 如果有多个参数, 可依次设置3 4 5 ...
 [invocation setArgument:&timer atIndex:2];
 // 设置第二个参数
 NSString *dsc = @"第二个参数是字符串";
 [invocation setArgument:&dsc atIndex:3];
 
 [invocation invoke];
 
 NSLog(@"start");
}
- (void)invocationTimeRun:(NSTimer *)timer des:(NSString *)dsc {
 
 static NSInteger num = 0;
 NSLog(@"%ld---%@--%@", (long)num, timer, dsc);
 
 num++;
 
 if (num > 4) {
 [timer invalidate];
 }
}

输出:


2016-12-29 16:57:45.087 定时器[12183:292324] 0---<__NSCFTimer: 0x60000016dbc0>--第二个参数是字符串
2016-12-29 16:57:45.088 定时器[12183:292324] start
2016-12-29 16:57:46.161 定时器[12183:292324] 1---<__NSCFTimer: 0x60000016dbc0>--第二个参数是字符串
2016-12-29 16:57:47.161 定时器[12183:292324] 2---<__NSCFTimer: 0x60000016dbc0>--第二个参数是字符串
2016-12-29 16:57:48.150 定时器[12183:292324] 3---<__NSCFTimer: 0x60000016dbc0>--第二个参数是字符串
2016-12-29 16:57:49.159 定时器[12183:292324] 4---<__NSCFTimer: 0x60000016dbc0>--第二个参数是字符串

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo

参数:

ti: 时间间隔 aTarget: 调用者 aSelector: 执行的方法 userInfo: 参数 yesOrNo: 是否重复执行

示例:


- (void)timer3 {
 
 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(targetRun:) userInfo:@"这是携带的参数" repeats:YES];
 
 NSLog(@"start");
}
- (void)targetRun:(NSTimer *)timer {
 
 static NSInteger num = 0;
 
 NSLog(@"%ld---%@--%@", (long)num, timer, timer.userInfo);
 
 num++;
 
 if (num > 4) {
 [timer invalidate];
 }
}