美文网首页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 —定时器的使用

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