iOS开发之笔记摘录

iOS基础之定时器

2017-09-01  本文已影响0人  平安喜乐698
目录

    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;
上一篇下一篇

猜你喜欢

热点阅读