输出:
2016-12-29 17:05:11.590 定时器[12328:296879] start
2016-12-29 17:05:12.655 定时器[12328:296879] 0---<__NSCFTimer: 0x608000162700>--这是携带的参数
2016-12-29 17:05:13.661 定时器[12328:296879] 1---<__NSCFTimer: 0x608000162700>--这是携带的参数
2016-12-29 17:05:14.664 定时器[12328:296879] 2---<__NSCFTimer: 0x608000162700>--这是携带的参数
2016-12-29 17:05:15.651 定时器[12328:296879] 3---<__NSCFTimer: 0x608000162700>--这是携带的参数
2016-12-29 17:05:16.650 定时器[12328:296879] 4---<__NSCFTimer: 0x608000162700>--这是携带的参数
下面这三种方式创建定时器的用法, 和上面相应的方法类似, 需要注意的是, 这样创建的定时器, 并不会执行, 需要我们手动来开启定时器;
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(void (^)(NSTimer *timer))block
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo
开启的方式是, 将当前定时器添加到RunLoop中:
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
下面给出一个示例:
- (void)timer4 {
NSTimer *timer = [NSTimer timerWithTimeInterval:1 repeats:YES block:^(NSTimer * _Nonnull timer) {
static NSInteger num = 0;
NSLog(@"%ld", (long)num);
num++;
if (num > 4) {
[timer invalidate];
timer = nil;
NSLog(@"end");
}
}];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
NSLog(@"start");
}
输出:
2016-12-29 17:12:13.955 定时器[12498:301751] start
2016-12-29 17:12:15.013 定时器[12498:301751] 0
2016-12-29 17:12:16.018 定时器[12498:301751] 1
2016-12-29 17:12:17.011 定时器[12498:301751] 2
2016-12-29 17:12:18.024 定时器[12498:301751] 3
2016-12-29 17:12:19.023 定时器[12498:301751] 4
2016-12-29 17:12:19.023 定时器[12498:301751] end
定时器基本的创建方式就这些了, 还可以设置其他的属性, 例如开启时间, 这些直接参考其API 进行设置即可;
注意: 以上实例中, 我没有使用全局的NSTimer 对象, 如果设置全局变量, 或者设置为属性, 在停止定时器的时候要手动置为nil, 即:
[timer invalidate];
timer = nil;
二. GCD
dispatch_after : 延迟执行一次
dispatch_after(dispatch_time_t when, dispatch_queue_t queue, dispatch_block_t block)
示例:
- (void)gcdTimer {
// 延迟2s
dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC);
dispatch_after(delayTime, dispatch_get_main_queue(), ^(void){
NSLog(@"延迟2s后执行");
});
NSLog(@"start");
}










