iOS精准定时器
NSTimer受runloop的影响,由于runloop需要处理很多任务,导致NSTimer的精度降低。
如果我们需要对定时器的精度要求很高的话,可以考虑dispatch_source_t去实现 。dispatch_source_t 精度很高,系统自动触发,系统级别的源。
- (void)viewDidLoad {
[super viewDidLoad];
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
//开始时间
dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, 3.0 * NSEC_PER_SEC);
/** 设置定时器
* para2: 任务开始时间
* para3: 任务的间隔
* para4: 可接受的误差时间,设置0即不允许出现误差
* Tips: 单位均为纳秒
*/
dispatch_source_set_timer(timer, start, 1.0 * NSEC_PER_SEC, 0.0 * NSEC_PER_SEC);
/** 设置定时器任务
* 可以通过block方式
* 也可以通过C函数方式
*/
dispatch_source_set_event_handler(timer, ^{
static int index = 0;
NSLog(@"index: %d", index++);
NSLog(@"%@", [NSThread currentThread]);
if(index == 5) {
//终止定时器(如果没有终止方法,则定时器不会启动)
dispatch_suspend(timer);
}
});
//启动任务,GCD计时器创建后需要手动启动
dispatch_resume(timer);
}
UIImageView 推迟显示图片
当UITableview滚动需要显示大量图片的时候,会造成卡段,可以通过 如下代码推迟显示。这样只有在defaultModel下才执行设置图片。
[self.imageView performSelector:@selector(setImage:) withObject:[UIImage imageNamed:@"tupian"] afterDelay:4.0 inModes:NSDefaultRunLoopMode];