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基础之定时器

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

  • 无标题文章

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

  • iOS进阶-谈谈定时器

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

  • iOS定时器,你真的会使用吗?

    前言 定时器的使用是软件开发基础技能,用于延时执行或重复执行某些方法。 我相信大部分人接触iOS的定时器都是从这段...

  • 定时器

    定时器 兼容ios

  • iOS中的定时器

    点击这里>> cocoaChina: iOS中的定时器 iOS中定时器有三种,分别是NSTimer、CADispl...

  • GCD定时器使用

    iOS中的常用定时器分为这几类: NSTimer CADisplayLink GCD定时器 选择GCD定时器原因:...

  • iOS:NSTimer的几种创建方式

    在iOS开发中,经常会用到定时器,iOS中常用的定时器有三种:NSTimer,GCD,CADisplayLink。...

  • iOS实战-更精准的定时器

    iOS中,常用的定时器有三种:NSTimer,CADisplayLink,GCD。在一定基础之上,做进一步探究。 ...

  • iOS Timer

    iOS开发中定时器经常会用到,iOS中常用的定时器有三种,分别是NSTime,CADisplayLink和GCD。...

网友评论

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

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