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

在异步后台线程上运行CADisplayLink的正确方式?

在异步后台线程上运行CADisplayLink的正确方式是将CADisplayLink添加到主线程的RunLoop中。下面是一个示例代码:

代码语言:txt
复制
// 在异步后台线程上创建CADisplayLink
DispatchQueue.global().async {
    // 创建CADisplayLink,并指定目标为self,选择合适的方法处理刷新事件
    let displayLink = CADisplayLink(target: self, selector: #selector(update))
    
    // 将CADisplayLink添加到主线程的RunLoop中
    displayLink.add(to: .main, forMode: .default)
    
    // 启动CADisplayLink
    displayLink.isPaused = false
    
    // 进入RunLoop,开始接收刷新事件
    RunLoop.current.run()
}

// 刷新事件处理方法
@objc func update() {
    // 在此处处理刷新事件
}

这种方式可以确保CADisplayLink在主线程上运行,同时在异步后台线程上启动一个RunLoop来接收刷新事件。这样可以保证CADisplayLink的刷新事件和UI的更新在主线程上同步进行,避免了多线程操作UI带来的问题。

CADisplayLink是一个定时器类,可以与屏幕的刷新频率进行同步,用于处理动画和其他需要精确时间控制的任务。它可以在特定的屏幕刷新时调用指定的方法,通常用于实现平滑动画效果。

在iOS开发中,可以使用CADisplayLink来优化动画性能、实现帧动画效果、处理游戏循环等。腾讯云提供了丰富的云计算产品,例如云主机、容器服务、弹性伸缩等,可以用于部署和运行基于CADisplayLink的应用程序。您可以访问腾讯云官网了解更多产品信息:腾讯云云计算产品

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

相关·内容

【译】正确线程观察

基本逻辑,但是Observable链和操作符究竟运行在哪个线程,仍然会有许多困惑。....observeOn( )操作符可以改变Observable将在哪个调度器发送通知。 另外,你需要知道,默认情况下,链操作符将会在调用.subsribeOn( )那个线程执行任务。...调用 .subscribeOn( ) 尽管代码片段线程中,但是整个代码块将运行在.subscribeOn( )定义线程: Observable.just(1,2,3) .subscribeOn...调用 .observeOn( ) 如果你代码片段线程中,默认情况下Observable创建是.subscribeOn( )定义线程,但是,调用.observeOn( )之后,余下代码将会执行在...()) .subscribe(); 通过用第二段代码代替第一段,.flatMap( )操作符(或者在这一点其他逻辑操作符)将运行后台线程

51420
  • Jenkins Operator —— Jenkins Kubernetes 正确打开方式

    Operator 是 Kubernetes 一种扩展机制,用户可以利用这种扩展机制来让自己应用以 Kubernetes native(k8s 原生)方式 kubernetes 平台上运行起来。...关于 Operator 更多详细内容,可以 Kubernetes 官方文档[2]查看。 Jenkins 是一款社区强大、API & 插件丰富、用户众多且开源持续交付工具。...为了让 Jenkins 能在 Kubernetes 更好运行,Jenkins 社区提供了 Jenkins Operator。...此 Operator 安装有两种方式: •用 kubectl 来完成安装•用 helm 来完成安装 关于两种方式不同使用命令,可以官网进行查看,本文选择用 kubectl 来完成。...,然后将这种描述代码存放到 GitHub

    1.9K20

    Anbox: Linux 运行 Android 应用程序简单方式

    Anbox 是 “Android in a box” 缩写。Anbox 是一个基于容器方法,可以普通 GNU/Linux 系统启动完整 Android 系统。 它是现代化新模拟器之一。...Anbox 可以让你在 Linux 系统运行 Android,而没有虚拟化迟钝,因为核心 Android 操作系统已经使用 Linux 命名空间(LXE)放置到容器中了。...Anbox 也可作为 snap 软件包安装,请确保你已经在你系统启用了 snap 支持。...如果你正在运行这些版本,那么你可以轻松地官方发行版软件包管理器帮助下安装。否则可以用 snap 软件包安装。 为使 Anbox 工作,确保需要内核模块已经安装在你系统中。...$ yuk -S anbox-git 否则,你可以通过导航到下面的文章来 Linux 中安装和配置 snap。如果你已经在你系统安装 snap,其它步骤可以忽略。

    5K20

    监测APP卡顿

    一、UI更新原理和卡顿原因 VSync 信号到来后,系统图形服务会通过 CADisplayLink 等机制通知 App,App 主线程开始 CPU 中计算显示内容,比如视图创建、布局计算、图片解码...所以,卡顿造成原因分为CPU卡顿和GPU卡顿,CPU卡顿可以用CADisplayLink来检测,UI更新卡顿可以用Runloopmode来检测 监测卡顿:开一个子线程,利用displaylink或者...Runloop运行方式,如下 int32_t __CFRunLoopRun() { // 通知即将进入runloop //创建AutoreleasePool: _objc_autoreleasePoolPush...kCFRunLoopCommonModes); // 创建信号 _semaphore = dispatch_semaphore_create(0); // 线程监控时长...selector,这时target可以读到 CADisplayLink 每次调用时间戳,用来准备下一帧显示需要数据。

    1.3K10

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

    第四种是开启一个新线程,将NSTimer添加到这个子线程RunLoop中,并使用DefaultRunLoopModes来执行。 第五种方式就是使用CADisplayLink来实现。...上述代码比较简单,就是Cell添加了一个定时器,然后没1秒更新一次时间,并在CelltimeLabel显示,运行效果如下所示。...在上述代码中我们可以看到我们使用全局并行队列来异步创建了一个Timer对象,然后将该对象添加进了该异步线程DefaultRunLoopMode中,然后运行该RunLoop。...我们开启了一个新线程,并且将CADisplayLink对象添加到这个子线程RunLoop中,然后线程中更新UI即可。具体代码如下: ? 我们对上述代码运行,下方是其对应运行结果。...从下方运行结果中我们不难看出,TableView滚动时该定时器也是可以正常运行。当然该方式实现定时器精度是比较高。 ?

    1.5K70

    Spring项目中以多线程方式并发执行,异步处理任务。解决统计、累加类业务例子。

    用多线程的话,项目中肯定首先考虑使用线程池。...4、CountDownLatch 线程中,一定要保证被调用到 countDown()。 5、线程池配置拒绝策略,另外三种都丢弃了任务,所以用交给主线程这种方法比较适合当前业务。...5月22日补充: 上面的实现方式,由于线程实例是实现Runable接口方式,Runable run() 方法没有返回值原因,所以用了公共参数,AtomicLong  在线程内部累计计算结果。...而且用了CountDownLatch 进行同步操作,来保证主线程获取结果时,所有子任务处理完毕。 如果我们用其他方式时可以不用这两步。 先说线程池 +Callable + Future方式。...+Callable + Future方式 1、线程配置 同上 2、Service 实现 /** * 查询数量使用线程池 */ @Autowired

    3.2K95

    iOS 优化界面流畅技巧

    异步绘制 我只显示文本控件用到了异步绘制功能,但效果很不错。我参考 ASDK 原理,实现了一个简单异步绘制控件。这块代码我单独提取出来,放到了这里:YYAsyncLayer。...当 TableView 快速滑动时,会有大量异步绘制任务提交到后台线程去执行。但是有时滑动速度过快时,绘制任务还没有完成就可能已经被取消了。...当这种情况变多时,或者 App 中使用了大量 concurrent queue 来执行较多任务时,App 同一时刻就会存在几十个线程同时运行、创建、销毁。...CPU 是用时间片轮转来实现线程并发,尽管 concurrent queue 能控制线程优先级,但当大量线程同时创建运行销毁时,这些操作仍然会挤占掉主线程 CPU 资源。...这个只是我一个设想,并不一定能实现或起作用。 如何评测界面的流畅度 最后还是要提一下,“过早优化是万恶之源”,需求未定,性能问题不明显时,没必要尝试做优化,而要尽量正确实现功能。

    1.5K10

    iOS 事件处理机制与图像渲染过程

    比如一个动画是更改alpha值从0到1,那么逻辑树上此属性会被立刻更新为最终属性1,而在动画树上会根据设置动画时间从0逐步变化到1); 渲染树(其属性值就是当前正被显示屏幕属性值); CADisplayLink... VSync 信号到来后,系统图形服务会通过 CADisplayLink 等机制通知 App,App 主线程开始 CPU 中计算显示内容,比如视图创建、布局计算、图片解码、文本绘制等。...而Core Graphics/Quartz 2D大部分绘制操作都是线程和CPU同步完成,比如自定义UIViewdrawRect里用CGContext来画图。...除了UIKit和CoreAnimation相关操作必须在主线程中进行,其他都可以挪到后台线程异步执行。...AsyncDisplay通过抽象UIView关系创建了ASDisplayNode类,ASDisplayNode是线程安全,它可以在后台线程创建和修改。

    5.5K100

    iOS 中定时器

    NSInvocation禁止其实也会影响到 NSProxy Swift 中使用, OC 中,我们一般会采用继承 NSProxy中方式实现一个弱代理来解决常见循环引用问题,比如常用YYKit...中 YYWeakProxy[1],但是 Swift 中这种方式是不行,需要继承NSObject来进行实现,这个具体后面会有介绍。...引申 当调用 NSObject performSelecter:afterDelay: 方法,实际其内部会创建一个 Timer 并添加到当前线程 RunLoop 中。...CADisplayLink CADisplayLink简单来说就是一个能让我们以和屏幕刷新率相同频率将内容画到屏幕定时器,不过,与其说它是一个定时器,不如说它是一个观察者,其回调由事件触发而非计时器.../// 这个方法设置任务只会执行一次,也就是Timer就绪后开始运行时候执行,类似于Timer开始一个通知回调。

    1.2K20

    求职笔记-iOS篇

    7、动画中图层树、逻辑树、动画树、显示树分别是什么? 8、APP生命周期(应用程序状态)有哪些? 9、多线程中同步方式有哪些?...APP生命周期 应用程序状态 Not running未运行:程序没启动; Inactive未激活:程序在前台运行,未接收到事件; Active激活:程序在前台运行,接受到事件; Backgroud后台...:程序在后台运行,在后台停留一段时间后进入挂起状态(Suspended),如果有音乐、下载等特殊任务程序可以长期处于Backgroud状态; Suspended挂起:程序在后台且不运行,当收到系统内存不足...还有一种:加载应用程序到后台(在后台打开网易云音乐) 前面的start部分一致,但最终进入不是Foreground状态,而是Background状态; Background长时间不运行,会导致应用程序进入...ios整个系统基本是基于runloop这种架构,ios程序main线程整体也是基于runloop,各种事件响应应该也是基于source这种思路。

    1.2K60

    iOS定时器,你真的会使用吗?前言正文结语

    ()中任务实在子线程中执行,若需要回到主线程,要调用dispatch_async(dispatch_get_main_queue(), ^{}....一般程序进入后台时,定时器会停止,但是定位APP中,需要持续进行定位,APP在后台时依旧可以运行,所以在后台定时器也是可以运行。...注:关于iOS后台常驻,可以查看这篇博客 使用GCD定时时候发现GCD定时器也可以在后代运行,后来很多人反映GCD定时器不能在后台运行,我测试了下,确实是这样。...但是我项目中使用GCD定时器确实是能在后台运行,是因为我开启 Background Modes 中后台持续定位,程序在后台依旧可以运行。 创建方法同上面的短信倒计时....要使定时器在后台运行,app 就需要在 后台常驻。 结语 最后总结一下: NSTimer 使用简单方便,但是应用条件有限。 CADisplayLink 刷新频率与屏幕帧数相同,用于绘制动画。

    2.4K50

    2021年,大厂常问iOS面试题--Runloop篇

    , App默认运行模式,通常主线程是在这个运行模式下运行 - UITrackingRunLoopMode, 跟踪用户交互事件(用于 ScrollView 追踪触摸滑动,保证界面滑动时不受其他Mode影响...将这个任务扔到了后台线程 RunLoop 中。 7.PerformSelector 实现原理?...当调用 performSelector:onThread: 时,实际其会创建一个 Timer 加到对应线程去,同样,如果对应线程没有 RunLoop 该方法也会失效。...11.CADispalyTimer和Timer哪个更精确 CADisplayLink 更精确 iOS设备屏幕刷新频率是固定CADisplayLink正常情况下会在每次刷新结束都被调用,精确度相当高...UI相关动画或者显示内容使用 CADisplayLink比起用NSTimer好处就是我们不需要在格外关心屏幕刷新频率了,因为它本身就是跟屏幕刷新同步

    1.9K10

    定时器 你真的会使用吗?

    `selector`调用间隔时间计算方式是:**调用间隔时间 = duration × frameInterval**。...事件回调 dispatch_source_set_event_handler(_timer, ^{ dispatch_async(dispatch_get_main_queue(), ^{ // 线程中实现需要功能...`dispatch_source_set_event_handler()`中任务实在子线程中执行,若需要回到主线程,要调用`dispatch_async(dispatch_get_main_queue...一般程序进入后台时,定时器会停止,但是定位APP中,需要持续进行定位,APP在后台时依旧可以运行,所以在后台定时器也是可以运行。...要使定时器在后台运行,app 就需要. 结语 最后总结一下: NSTimer 使用简单方便,但是应用条件有限。 CADisplayLink 刷新频率与屏幕帧数相同,用于绘制动画。

    95920

    YYImage框架瞧一瞧

    2、返回图片被分配给UIImageView 3、接着一个隐式 CATransaction 捕获到了图层树变化; 4、线程下一个 run loop到来时,Core Animation 提交了这个隐式事务...)洋葱看过去有很多层,这就是洋葱图层,而屏幕显示文字、图片啊,都可以理解成为图层,很多图层就形成了一个结构,这个很多图层结构就叫做图层树。...[holder class]; // 捕获字典到全局队列,在后台释放这些图像以避免阻塞UI线程。...} 重置图片参数; 内存警告时释放内存; 初始化一个新 CADisplayLink 对象,屏幕更新时调用。...,每次打印都是 name = (null),说明异步线程 // 异步线程再次调用解码图片,如果无法解码或已经解码就返回self img

    2.1K30

    YYImage 源码剖析:图片处理技巧

    加载优化 对于加载过程,若文件过大或加载频繁影响了帧率(比如列表展示大图),可以使用异步方式加载图片,减少主线程压力,代码大致如下: dispatch_async(dispatch_get_global_queue...而系统默认是线程执行,所以业界通常有一种做法是,异步强制解压,也就是异步线程主动将二进制图片数据解压成位图数据,使用CGBitmapContextCreate(...)系列方法就能实现。...该处理方式众多图片处理框架下都有体现。 3、超大图处理 值得注意是,可能业务中需要载入一张很大图片。...由于是解压后,所以该方法实际上会消耗一定 CPU 资源,所以实际使用中可以异步线程调用。...收到内存警告时处理方式大同小异,不多赘述。 5、计时器 该类使用CADisplayLink做计时任务,显示系统每帧回调都会触发,所以默认大致是 60 次/秒。

    1.4K41

    iOS 如何监测 FPS

    前言 现在如果在网络搜的话,基本大多数用于检测FPS控件都是通过 CADisplayLink 来实现。...CADisplayLink 实际跟平常用 NSTimer 用法基本相似,NSTimer 时间间隔是以秒为单位,而 CADisplayLink 则是使用帧率来作为时间间隔单位。...在这篇文章中,发现作者也遇到相同问题:iOS中基于CADisplayLinkFPS指示器详解[1] 根据大神 ibireme 文章iOS 保持界面流畅技巧[2]介绍,我们能够知道屏幕中显示图像过程中...由此可以得知,因为 CADisplayLink 运行取决于 RunLoop。...故使用 CADisplayLink 并不能很准确反映当前屏幕 FPS! 主线程卡顿监测 由于 CADisplayLink 并不能够准确反映出来,所以常用方法时主线程卡顿监测。

    1.9K30

    iOS多线程——你要知道GCD都在这里你要知道iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里

    本篇文章将会介绍一个抽象层次更高线程编写方式GCD,GCD全称Grand Central Dispatch是苹果提供一个多核编程解决方案,真正意义实现了并行操作,而不是并发。...,可以很方便以多线程方式执行。...,按照并发队列特性,这里三个任务完全可能由不同三个线程来执行,但由于viewWillAppear:方法是主线程执行,而且主线程又被阻塞了,底层可能因此选择了主线程来执行,多运行几次就会发现也有可能使用其他线程来执行...,这里传入了一个全局并发队列,因此讲道理重复执行任务时就应该有多个线程并发执行,但是不管我迭代多少次运行多少次都只有一个输出是其他线程输出,剩余都是同一个线程输出,有懂读者可以留言讲解一下。...实现定时器三种方法 定时器开发中是比较常见需求,常用其实有三种方法:NSTimer、GCD以及CADisplayLinkCADisplayLink是其中精度最高,因为它试图与屏幕刷新率保持一致

    2K100
    领券