首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用NSTimer获得准确的计时

作为一个云计算领域的专家,我建议使用 CADisplayLink 而不是 NSTimer 来获得更准确的计时。CADisplayLink 是一个专门为屏幕刷新率设计的计时器,它会在每次屏幕刷新时触发,确保计时更加准确和流畅。

以下是使用 CADisplayLink 的示例代码:

代码语言:swift
复制
import UIKit

class ViewController: UIViewController {

    private var displayLink: CADisplayLink?
    private var startTime: CFTimeInterval = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        startDisplayLink()
    }

    private func startDisplayLink() {
        displayLink = CADisplayLink(target: self, selector: #selector(updateTime))
        displayLink?.add(to: .main, forMode: .common)
        startTime = CACurrentMediaTime()
    }

    @objc private func updateTime() {
        let currentTime = CACurrentMediaTime()
        let elapsedTime = currentTime - startTime

        // 在这里处理你的计时逻辑
        print("Elapsed time: \(elapsedTime)")
    }
}

这段代码将创建一个 CADisplayLink 实例,并在每次屏幕刷新时调用 updateTime 方法。在 updateTime 方法中,你可以处理你的计时逻辑。

使用 CADisplayLink 的优势是它能够提供更准确的计时,尤其是在处理动画和游戏等需要高精度计时的场景。同时,它还可以避免一些 NSTimer 的局限性,例如可能会受到系统时间调整的影响,以及在后台运行时可能会暂停计时等。

总之,使用 CADisplayLink 可以帮助你获得更准确的计时,特别是在需要高精度计时的场景中。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

NSTimer使用

target:(id)aTarget   selector:(SEL)aSelector   userInfo:(id)userInfo   repeats:(BOOL)yesOrNo; 创建返回一个新NSTimer...对象和时间表,在当前默认模式下循环调用一个实例方法。...表示输入一个时间间隔对象,以秒为单位,一个>0浮点类型值,如果该值<0,系统会默认为0.1  target:(id)aTarget 表示发送对象,如self  selector:(SEL)aSelector...方法选择器,在时间间隔内,选择调用一个实例方法 userInfo:(id)userInfo 此参数可以为nil,当定时器失效时,由你指定对象保留和释放该定时器。...他可以完成任何定时功能: 我们使用起来也很简单,只要记住三要素就可以,具体得三要素是:时间间隔NSTimeInterval浮点型,事件代理 delegate和事件处理方法@selector();就可以用

70790

iOS开发之UITableView中计时几种实现方式(NSTimer、DispatchSource、CADisplayLink)

本篇博客会给出在TableView中使用NSTimer或者DispatchSourcer中常见五种方式。当然下方第一种方式是常规做法,不过也是UITableView中使用NSTimer一个坑。...接下来我们先来总结一下本篇博客所涉及四种方式: 第一种就是直接在TableViewCell上使用NSTimer,当然这种方式是有问题,稍后会介绍。...第四种是开启一个新子线程,将NSTimer添加到这个子线程中RunLoop中,并使用DefaultRunLoopModes来执行。 第五种方式就是使用CADisplayLink来实现。...一、在Cell中直接使用NSTimer 首先我们按照常规做法,直接在UITableViewCell上添加相应NSTimer, 并使用scheduledTimer执行相应代码块。...四、DispatchTimerSource 接下来我们就不使用NSTimer来实现定时器了。在之前博客中聊GCD时其中用到了DispatchTimerSource来实现定时器。

1.4K70

Objective-C三种定时器CADisplayLink NSTimer GCD使用

优势:依托于设备屏幕刷新频率触发事件,所以其触发时间上是最准确。也是最适合做UI不断刷新事件,过渡相对流畅,无卡顿感。...通常我们使用这个属性来做计时暂停与恢复。...我们知道NSTimer事件触发事件是不准确,完全取决于当前runloop处理时间。...关于invalid方法 我们知道NSTimer使用时候如果不注意的话,是会造成内存泄漏。原因是我们生成实例时候,会对控制器retain一下。...劣势:虽然说不受runloopMode影响,但是其计时效应仍不是百分之百准确。 另外,他触发事件也有可能被阻塞,当GCD内部管理所有线程都被占用时,其触发事件将被延迟。

2.1K31

如何校准振弦采集模块以获得准确读数?

如何校准振弦采集模块以获得准确读数?振弦采集模块是一种用于测量振弦传感器输出模块。在使用振弦采集模块时,校准是非常重要,因为它可以确保您获得准确测量结果。...本文将介绍如何校准振弦采集模块以获得准确读数。图片1. 使用标准信号源进行校准首先,您需要使用标准信号源进行校准。标准信号源可以生成已知频率和振幅信号。...检查传感器连接如果振弦采集模块无法获得准确读数,则可能是振弦传感器连接出现问题。您可以通过以下方法检查传感器连接:- 确保传感器连接正确。- 检查传感器电缆是否破损或断开。...重复校准操作振弦采集模块在使用过程中可能会出现漂移,这会影响读数准确性。因此,我们建议您定期重复校准操作,以确保准确性。图片总结,在使用振弦采集模块时,校准是非常重要。...通过使用标准信号源进行校准,检查外部干扰、传感器连接和采集模块设置,以及重复校准操作可以保证获得准确读数。

12430

老司机带你走进Core Animation 之CADisplayLink

不过既然苹果专门提供了这么一个类,就一定是有他存在意义。他优势就在于他执行频率是根据设备屏幕刷新频率来计算。换句话讲,他也是时间间隔最准确定时器。 还是在使用中介绍吧。...类比NSTimer,CADisplayLink也有一个计时器销毁方法: -(void)invalidate; 调用这个方法,会从所有runLoop中移除当前实例,这个方法可以用于不需要计时器后对他进行释放前操作...接着说一下他五个属性。 fireDate,设置当前timer事件触发时间。通常我们使用这个属性来做计时暂停与恢复。...我们知道NSTimer事件触发事件是不准确,完全取决于当前runloop处理时间。...GCDTimer优势:不受当前runloopMode影响。 劣势:虽然说不受runloopMode影响,但是其计时效应仍不是百分之百准确

1.4K20

系统框架--52:NSTimer会保留其目标对象

NSTimer 计时器要和runloop相关联,runloop会触发任务。创建NSTimer时,可以将其“预先安排”在当前runloop中,也可以创建好,然后再由开发人员自己调度。...无论采用什么方式,只要把计时器放在循环里,它才能创建好触发任务 //将其预先安排在当前runloop中 self.timer = [NSTimer scheduledTimerWithTimeInterval...也就是合适时候调用end方法。然而,合适时机很难找到。假如这是一个验证码倒计时程序,你可以在倒计时结束时调用end方法。...但是你不能确定用户一定会等倒计时结束才返回到上一级页面.或许你想在dealloc方法中使定时器失效,那你就太天真了。此时定时器还保留着当前控制器,此方法是不可能调用,因此会出现内存泄漏。...或许在倒计时程序中,你可以重写返回方法,先调用end再返回,但这不是一个好主意 这里采用block块方法为NSTimer增加一个分类,具体细节看代码(程序员最好语言是代码)。

11210

iOS 如何解决 NSTimer 循环引用

前言 ---- 在使用 NSTimer,如果使用不得当特别会引起循环引用,造成内存泄露。所以怎么避免循环引用问题,下面我提出几种解决 NSTimer 几种循环引用。 2....,NSTimer 强引用 PFTimer,避免让NSTimer 强引用 ViewController,这样就不会引起循环引用,然后在 dealloc 方法中执行 NSTimer 销毁,相对 PFTimer...使用很简单,但是要注意两点: 避免 block 循环引用,使用 __weak 和 __strong 来避免 在持用 NSTimer 对象方法中 -(void)dealloc 调用 NSTimer...使用 block 来解决 ---- 通过创建一个 NSTimer category 名字为 PFSafeTimer,在 NSTimer+PFSafeTimer.h 代码如下: #import <Foundation...计时器现在 target 是 NSTimer 类对象,这是个单例,因此计时器是否会保留它,其实都无所谓。此处依然有保留环,然而因为类对象(class object)无需回收,所以不用担心。

1.4K30

浅析 NSTimer 和 CADisplayLink 内存泄漏

内存泄漏原因 谈论 NSTimer & CADisplayLink 内存泄漏,要理解 NSTimer & CADisplayLink 基础概念,下面通过一个倒计时实现 demo 进入正题。...第一种就是直接在 TableView Cell 上使用 NSTimer,然后添加到当前线程所对应 RunLoop 中 commonModes 中。...第二种是通过 Dispatch 中 TimerSource 来实现定时器。 第三种是使用 CADisplayLink 来实现。...以 UITableViewCell 为例: 一、在 Cell 中直接使用 NSTimer 首先我们按照常规做法,直接在 UITableView Cell 上添加相应 NSTimer, 并使用 scheduledTimer...例如一个视频应用使用时间戳来计算下一帧要显示视频数据。在UI做动画过程中,需要通过时间戳来计算UI对象在动画下一帧要更新大小等等。

1.5K10

浅谈 NSTimer 是否精确?

面试时候遇到一个问题,问 NSTimer 用做定时器时候是否精确?...NSTimer 启动依赖 RunLoop,如果在主线程中做了耗时操作,当前 RunLoop 持续时间超过了定时器间隔时间,那么下一次定时就被延后了。...3510935] timer test 从结果中可以看出,如果在主线程中没有做耗时操作,其计时偏差基本在1毫秒以内。...-09-15 13:34:13.678671+0800 NSTimer&CADisplayLink[60575:3527468] timer test 从结果中可以看出,如果在主线程中做耗时操作,其计时偏差已经去到了...总结 NSRunLoop 问题请查看这里 从结果看,NSTimer 在其使用场景下足够准了,其计时偏差基本在1毫秒以内也在容忍范围之内,如果想使用更精确定时器,可以使用 CADisplayLink

55920

IOS开发中滑动页面时NSTimer停止问题

我们在做倒计时时候,发现当你手指按着屏幕不放,拖动tableView滑动时候,写在cell上得倒计时停止倒计时,松开继续倒计时。研究发现就是拖动tableView滑动时,NSTimer停止了。...接着上面的话题,在开启一个NSTimer实质上是在当前runloop中注册了一个新事件源,而当scrollView滚动时候,当前 MainRunLoop是处于UITrackingRunLoopMode...runloopmode. 1 [[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes]; 简单说就是NSTimer...当Runloop在A mode,而timer注册在B mode时就无法去检测这个timer,所以需要把NSTimer也注册到A mode,这样就可以被检测到。...一个简单例子,创建NSTimer进行倒计时时,修改model: - (id)initWithTimeout:(NSInteger)total { if (self = [self init])

1.7K90

iOS开发——带有暂停功能计时

上篇博客我跟大家分享了如何在iOS系统中使用原生框架获取步数,又是大半个月过去了,运动模块全部功能也总算完成了,也打算有始有终把如何做一个跑步类App跟大家分享了。...运动类应用中,有一个很重要模块就是计时器,当然,这个计时器不算复杂,只要有简单开始、暂停以及复位功能即可。那么今天我们从Model层来看看这个计时逻辑实现。...private var timer: NSTimer?...//计时开始 func timingStart(){ startTimes.append(NSDate()) timer = NSTimer.scheduledTimerWithTimeInterval...//从以秒计时时间里获得表示时间字符串用于显示 func getTimeStringFromSecond(seconds: Int) -> String { let secondNumber

1.6K10

iOS开发中创建定时器

,按钮上秒数进行倒计时) 创建定时器方式: 1.利用NSTimer 2.利用GCD中dispatch_source_t 代码: 利用NSTimer创建定时器代码: 方式一: (void)...方式一是将NSTimer添加到了主线程runloop中,但添加是NSRunLoopCommonModes模式下,如果是添加在NSDefaultRunLoopMode模式下那么当用户与页面进行交互时候...方式二是开辟了一个子线程,在子线程runloop中添加了NSTimer,此时即使模式是NSDefaultRunLoopMode,在用户与页面进行交互时候,定时器依然有效。...dispatch_source_cancel(_timer); dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"计时结束...{ NSLog(@"---%lu", time); }); time ++; } }); dispatch_resume(_timer); } 注意:必须使用

88620
领券