iOS基础之定时器

作者: 平安喜乐698 | 来源:发表于2017-09-01 15:54 被阅读0次
    目录
    
        1. NSTimer
    

    三种常见的定时器:NSTimer、CADisplayLink以及GCD Timer

    1. NSTimer
    方式一:
        // 创建计时器(1s执行一次)
        NSTimer * timer = [[NSTimer alloc]initWithFireDate:[NSDate distantFuture] interval:1 target:self selector:@selector(myLog:) userInfo:nil repeats:YES];
        // 添加(默认会被添加到NSDefaultRunLoopMode模式下,滚动时无效)
        [[NSRunLoop mainRunLoop]addTimer:timer forMode:NSRunLoopCommonModes];
        /*
    消息处理机制(不断循环检测事件发生)
         NSDefaultRunLoopMode   默认模式。在滚动时NSTimer会失效,可添加到NSRunLoopCommonModes中。
         NSEventTrackingRunLoopMode 仅在滚动时有效(用于SV和别的控件的动画)
         NSRunLoopCommonModes 组合模式:1+2
         */
        // 激活计时器
        [timer fire];
        
    
    // 创建并激活计时器
        NSTimer *timer2=[NSTimer scheduledTimerWithTimeInterval:1.0 repeats:true block:^(NSTimer * _Nonnull timer) {
        }];
    // 创建并激活计时器
        NSTimer *timer3=[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(handleTimer) userInfo:nil repeats:true];
    
    
    
    
        // 暂停计时器
        timer.fireDate=[NSDate distantFuture];
        // 继续计时器
        timer.fireDate=[NSDate date];
        // 销毁计时器
        [timer invalidate];
        timer=nil;
    
    方式二:NSInvocation
    
        // 1.初始化一个Invocation对象
        //
        NSInvocation * invo = [NSInvocation invocationWithMethodSignature:[[self class] instanceMethodSignatureForSelector:@selector(handleTimer:)]];
        // 或
        NSInvocation *invo=[NSInvocation new];
        [invo setTarget:self];
        [invo setSelector:@selector(handleTimer:)];
        
        // 2.创建NSTimer
        // 创建NSTimer(1s,invo,是否重复)
        NSTimer * timer = [NSTimer timerWithTimeInterval:1 invocation:invo repeats:YES];
        // 加入主循环池中
        [[NSRunLoop mainRunLoop]addTimer:timer forMode:NSDefaultRunLoopMode];
        // 启动(开始循环)
        [timer fire];
    
    
        // 2.创建NSTimer并启动
        NSTimer * timer = [NSTimer scheduledTimerWithTimeInterval:1 invocation:invo repeats:YES];
    
    2. CADisplayLink
        // :NSObject,不能被继承
        // 基于Core Animation
        // NStimer是以秒为单位来刷新,CADisplayLink是以帧为单位刷新,可能会跳帧。
        CADisplayLink *displayLink=[CADisplayLink displayLinkWithTarget:self selector:@selector(handleChange:)];
        // 设置每秒刷新次数(默认值为屏幕最大帧率)
        [displayLink setPreferredFramesPerSecond:60];
        // 添加到NSRunLoop指定Mode(必须)
        // 
    每当屏幕显示内容刷新结束的时候,runloop就会向 CADisplayLink指定的target发送一次指定的selector消息, CADisplayLink类对应的selector就会被调用一次
        [displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
        
        // 上一次屏幕刷新的时间戳
        double time=displayLink.timestamp;
        // 下一次渲染的时间戳
        double timeNext=displayLink.targetTimestamp;
        
        // 每帧之间的时间(即屏幕每次刷新之间的的时间),readOnly
        double duration=displayLink.duration;
    
        // 是否暂停
        [displayLink setPaused:true];
    
        // 从NSRunLoop指定Mode中移除(要避免多次调用崩溃)
        [displayLink removeFromRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes];
        // 销毁计时器(不会出现崩溃),从NSRunLoop所有Mode中移除
        [displayLink invalidate];
        displayLink=nil;
    

    相关文章

      网友评论

        本文标题:iOS基础之定时器

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