1.GCD
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC);
dispatch_after(time, dispatch_get_main_queue(), ^{
// 延时执行操作
});
注:dispatch_after方法本质是将任务延时添加到队列中,并不是延时执行任务,所以在对时间要求不是那么高的情况下也可以满足延时执行的要求。
2.performSelector
performSelector:<#(nonnull SEL)#> withObject:<#(nullable id)#> afterDelay:<#(NSTimeInterval)#> inModes:<#(nonnull NSArray<NSRunLoopMode> *)#>
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
label.backgroundColor = [UIColor redColor];
[self.view addSubview:label];
[label performSelector:@selector(setText:) withObject:@"延时2秒显示文字" afterDelay:2.0 inModes:@[NSRunLoopCommonModes]];
// 如果不使用系统的方法,也可以自定义方法
[self performSelector:@selector(showText) withObject:nil afterDelay:2.0 inModes:@[NSRunLoopCommonModes]];
注:mode使用NSRunLoopCommonModes的原因是当界面上有tableView、scrollView、textView等可滑动的view时,view滑动时延时执行函数不受影响。
3.NSTimer
/**
scheduledTimerWithTimeInterval创建的定时器会默认以NSDefaultRunLoopMode的方式自动添加到当前的runloop中
*/
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(delay) userInfo:nil repeats:NO];
/**
timerWithTimeInterval创建的定时器需要手动添加到runloop中
*/
NSTimer *timer = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(delay) userInfo:nil repeats:NO];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
/**
不用时记得销毁
*/
[timer invalidate];
timer = nil;
注:如果界面上有tableView、scrollView、textView等可滑动的view,
当view滑动时,采用以上方式添加的定时器会停止,需要设置runloop的mode
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(delay) userInfo:nil repeats:NO];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
NSTimer *timer = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(delay) userInfo:nil repeats:NO];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
网友评论