在iOS开发中,我们可以通过三种途径来实现定时调用某一个方法的功能。为了简便期间,我直接在Xcode中写代码以及注释。
首先我们定义一个被定时执行的方法
- (void)reloop { NSLog(@"循环执行"); }
1、使用NSTimer
// 1、使用nstimer创建定时器 // A.自动加入主循环 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(reloop) userInfo:nil repeats:YES]; // 激活定时器 [timer fire]; // 在循环调用时,必须手动释放定时器,否则不必手动释放 [timer invalidate];
// B.手动加入主循环 NSTimer *timer = [NSTimer timerWithTimeInterval:2 target:self selector:@selector(reloop) userInfo:nil repeats:YES]; [timer fire]; [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
2、使用CADisplayLink
// 屏幕刷新时调用 // CADisplayLink是一个能让我们以和屏幕刷新率同步的频率将特定的内容画到屏幕上的定时器类。CADisplayLink以特定模式注册到runloop后,每当屏幕显示内容刷新结束的时候,runloop就会向CADisplayLink指定的target发送一次指定的selector消息, CADisplayLink类对应的selector就会被调用一次。所以通常情况下,按照iOS设备屏幕的刷新率60次/秒 // 延迟 // iOS设备的屏幕刷新频率是固定的,CADisplayLink在正常情况下会在每次刷新结束都被调用,精确度相当高。但如果调用的方法比较耗时,超过了屏幕刷新周期,就会导致跳过若干次回调调用机会。 // 如果CPU过于繁忙,无法保证屏幕60次/秒的刷新率,就会导致跳过若干次调用回调方法的机会,跳过次数取决CPU的忙碌程度。 // 使用场景 // 从原理上可以看出,CADisplayLink适合做界面的不停重绘,比如视频播放的时候需要不停地获取下一帧用于界面渲染。 // 2.1创建出displaylink对象 CADisplayLink *displyLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(reloop)]; // 2.2 将该对象加入循环中 [displyLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; // 2.3再不需要时释放(停止循环) [displyLink invalidate]; displyLink = nil;3、使用GCD
// 只执行一次 double delayInSeconds = 2.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ // 执行事件 [self reloop]; }); // 重复执行 NSTimeInterval period = 1.0; //设置时间间隔 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_source_t _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), period * NSEC_PER_SEC, 0); //每秒执行 dispatch_source_set_event_handler(_timer, ^{ //在这里执行事件 [self reloop]; }); dispatch_resume(_timer);
原文地址:http://blog.csdn.net/quanzheng92/article/details/45844087