美文网首页iOS开发点滴
iOS —定时器的使用

iOS —定时器的使用

作者: 沧冥海 | 来源:发表于2016-08-29 14:13 被阅读31次

一、NSTimer的使用

- (void)createNSTimer
{
    // 调用创建方法后,target对象的计数器会加1,直到执行完毕,自动减1。如果是循环执行的话,就必须手动关闭,否则可以不执行释放方法
    // 必须进行停止 —— 释放 [_timer invalidate];
    // 自动把timer加入MainRunloop的NSDefaultRunLoopMode中
#if 0
    _GZDTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(Logs) userInfo:nil repeats:YES];
#endif
    // 这种方法需要手动添加到NSDefaultRunLoopMode runloop的运行循环中,否则无法运行
    _GZDTimer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(Logs01) userInfo:nil repeats:YES];
    [[NSRunLoop mainRunLoop] addTimer:_GZDTimer forMode:NSDefaultRunLoopMode];
}
- (void)Logs
{
    NSLog(@"NSTimer 自动运行循环  >>>>>>>");
}
- (void)Logs01
{
    NSLog(@"NSTimer 手动运行循环  >>>>>>>");
}

二、CADisplayLink的使用

// 使用CADisplayLink需要记得停止定时器,停止的方法
    // 停止displayLink的定时器
    //[self.displayLink invalidate];
    //self.displayLink = nil;

- (void)createCADisplayLink
{
    self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(GZDDisplayLink)];
    // NSInteger类型的值,用来设置间隔多少帧调用一次selector方法,默认值是1,即每帧都调用一次。
    
    // readOnly的CFTimeInterval值,表示两次屏幕刷新之间的时间间隔。需要注意的是,该属性在target的selector被首次调用以后才会被赋值。selector的调用间隔时间计算方式是:调用间隔时间 = duration × frameInterval。
    
    /**当把CADisplayLink对象add到runloop中后,selector就能被周期性调用,类似于重复的NSTimer被启动了;执行invalidate操作时,CADisplayLink对象就会从runloop中移除,selector调用也随即停止,类似于NSTimer的invalidate方法。**/
    [self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
}
- (void)GZDDisplayLink
{
    NSLog(@"GZDDisplayLink >>>>>>> ");
}

三、GCD

- (void)createGCD
{
    /**
     *  只执行一次
     */
#if 0
    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){
            //执行事件
        NSLog(@"只执行一次>>>>>>>");
        });
#endif
    
    NSTimeInterval timerInterval = 1.0; //设置时间间隔
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    // _timer必须为全局变量
    _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
    dispatch_source_set_timer(_timer, dispatch_walltime(NULL, 0), timerInterval * NSEC_PER_SEC, 0); //每秒执行
    dispatch_source_set_event_handler(_timer, ^{
        //在这里执行事件
        NSLog(@"GCD -----  1s执行一次  >>>>>>>");
    });
    dispatch_resume(_timer);
}

详细的源码可以去我的github下载参考
https://github.com/daniel1214/160829-TimeUser

相关文章

  • 无标题文章

    iOS NSTimer使用详解-开启、关闭、移除 定时器定时器详解ios定时器关闭定时器NSTimer 1、要使用...

  • Flutter 网络请求类封装及搜索框实现

    Flutter 中定时器的使用 在 Flutter 中定时器相对 iOS 来说比较好的一点就是定时器事件的执行不会...

  • GCD定时器封装

    前言 iOS开发中,经常需要使用到定时器,使用NSTimer很容易出现内存泄漏,在此简单封装GCD定时器。 1.定...

  • iOS定时器的添加方式及其与runloop的关系

    定时器是iOS开发中频繁使用的开发技能,存在多种创建方式,可根据实际需求选用;iOS中的定时器大致分为这几类: N...

  • iOS14开发-Timer

    定时器可以设置按固定周期执行某个操作。iOS 中主要有 3 种定时器,本文先讲解第一种 Timer。 使用 iOS...

  • iOS gcdTimer VS NSTimer

    iOS中定时器的使用demo地址:https://github.com/liuxuleidota/LXLGCDTi...

  • iOS进阶-谈谈定时器

    目录 iOS提供定时器API 定时器开发中的坑 一、 iOS提供定时器API 二、定时器开发中的坑 2.1、必须办...

  • iOS 中定时器小记

    1.iOS 中定时器的解决方案? (1).CADisplayLink 使用简单,代码简洁,和屏幕刷帧频率相同,使用...

  • iOS从timer释放问题看内存管理

    在iOS的开发中,如果使用NSTimer做定时器,一定要在合适的时机销毁这个定时器,不然可能导致内存得不到释放。原...

  • 定时器

    定时器 兼容ios

网友评论

    本文标题:iOS —定时器的使用

    本文链接:https://www.haomeiwen.com/subject/jzvxettx.html