写在前头
在开发过程中,总是会遇到这样的需求:循环更新、处理,延时处理等事件。在这里总结了一些常用的延时和按时更新的用法
dispatch_after
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"执行任务");
});
注意:dispatch_after函数并不是延迟对应时间后立即执行block块中的操作,而是将任务追加到对应队列中,考虑到队列阻塞等情况,所以这个任务从加入队列到真正执行的时间是不准确的。
该方法没有办法取消,但是可以在执行block内代码时进行条件判断,然后再决定是否要执行该段代码。
performSelector
关于performSelector的相关用法,我会单独写一篇文章进行总结,这里只介绍关于延时的两个用法。
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay inModes:(NSArray *)modes;
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;
performSelector:withObject:afterDelay:
其实就是在内部创建了一个NSTimer,然后会添加到当前线程的Runloop中。
[self performSelector:@selector(test) withObject:nil afterDelay:4];
在需要取消 test
这个方法的执行的时候调用
[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(test) object:nil];
注意事项:
- 在子线程中执行会不会调用test方法
- test方法执行的线程与调用时所处的线程一致
由于该方法需要用到线程RunLoop,那么一定要手动run,才会生效。而且