You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

macOS平台下如何实现CADisplayLink.init(target:selector:)的等效功能?

CADisplayLink支持以下平台:

  • iOS
  • iPadOS
  • macOS
  • Mac Catalyst
  • tvOS
  • visionOS

但 CADisplayLink.init(target:selector:) 在 macOS 平台不可用。请问在该平台实现相同行为的正确方式是什么?


解决方案

在macOS上,你可以通过NSRunLoop提供的方法创建并使用CADisplayLink,实现和init(target:selector:)完全一致的屏幕同步刷新行为,具体步骤如下:

  1. 创建CADisplayLink实例
    使用NSRunLoop.current.addDisplayLink(withTarget:selector:)方法直接创建并绑定到当前RunLoop,该方法会返回可用的CADisplayLink对象:

    let displayLink = NSRunLoop.current.addDisplayLink(withTarget: self, selector: #selector(handleFrameUpdate))
    
  2. 配置刷新参数
    可根据需求设置帧率、绑定的RunLoop模式,和iOS平台用法一致:

    // 设置每秒刷新60帧
    displayLink.preferredFramesPerSecond = 60
    // 将displayLink添加到指定RunLoop模式(可选,默认已添加到default模式)
    displayLink.add(to: .current, forMode: .common)
    
  3. 实现刷新回调
    编写对应的选择器方法,在每次屏幕垂直同步时执行业务逻辑:

    @objc func handleFrameUpdate(_ displayLink: CADisplayLink) {
        // 执行帧更新操作,比如动画帧刷新、实时绘制等
    }
    
  4. 停止并释放
    当不再需要刷新时,调用invalidate()方法终止displayLink:

    displayLink.invalidate()
    

这种方式本质上和iOS平台的CADisplayLink.init(target:selector:)逻辑一致,都是绑定到RunLoop并跟随屏幕刷新信号触发回调,能保证动画或实时绘制的流畅性。

内容的提问来源于stack exchange,提问作者Marc_Alx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 05:34:52