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

对于在主线程上运行的NSTimer,这是正确的吗?

对于在主线程上运行的NSTimer,这是正确的。NSTimer是一种用于触发定时器事件的类,可以在特定的时间间隔内重复执行或者只执行一次。在主线程上运行NSTimer是常见且通常是正确的做法,因为主线程负责处理用户界面的更新和响应,而定时器事件通常也需要与用户界面相关。

然而,需要注意的是,如果定时器事件的执行时间较长或者频率较高,可能会导致主线程阻塞,造成用户界面的卡顿。为了避免这种情况,可以考虑以下两种方案:

  1. 使用GCD(Grand Central Dispatch)或者NSOperationQueue创建一个后台线程,在该线程上运行NSTimer。这样可以将定时器事件的处理与主线程分离,避免主线程阻塞。
  2. 使用CADisplayLink替代NSTimer。CADisplayLink是一种与屏幕刷新率同步的定时器,适用于需要频繁刷新UI的场景。与NSTimer不同,CADisplayLink会在每一帧刷新之前调用定时器的方法,确保定时器事件不会阻塞主线程。

在腾讯云的产品中,与定时器相关的服务和产品包括:

  • 云函数(SCF):云函数是一种无服务器的事件驱动计算服务,可帮助您编写和运行不需要管理服务器的代码。您可以使用云函数来创建定时触发器,以在特定时间间隔内触发函数执行。 腾讯云云函数介绍
  • 弹性计算(CVM):弹性计算提供了云服务器实例,您可以在实例上创建和管理定时器事件。通过编写脚本或应用程序,您可以在云服务器上运行定时任务。 腾讯云弹性计算介绍
  • 定时消息队列(TDMQ):定时消息队列是一种消息服务,可让您按计划发送和接收消息。您可以设置消息的定时发送和定时消费,来实现定时任务的触发和执行。 腾讯云定时消息队列介绍

以上是一些腾讯云提供的与定时器相关的产品和服务,供您参考和选择。

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

相关·内容

iOS多线程:『RunLoop』详尽总结RunLoop

RunLoop实际上是一个对象,这个对象在循环中用来处理程序运行过程中出现的各种事件(比如说触摸事件、UI刷新事件、定时器事件、Selector事件),从而保持程序的持续运行;而且在没有事件处理的时候,...那难道我们就不能在这两种模式下让NSTimer都能正常工作吗?...这下我们就可以来理解RunLoop的运行逻辑了。 下边上一张之前提到的文章中博主提供的运行逻辑图(来源:http://blog.ibireme.com/2015/05/18/runloop/) ?...RunLoop运行逻辑图 这张图对于我们理解RunLoop来说太有帮助了,下边我们可以来说下官方文档给我们的RunLoop逻辑。...在每次运行开启RunLoop的时候,所在线程的RunLoop会自动处理之前未处理的事件,并且通知相关的观察者。

2.1K50
  • 暗影骑士擎bios详解_runloop原理和机制

    kCFRunLoopExit(128):退出runloop时会自动销毁最后一个创建的autorelease 对于runloop的理解不正确的是 A 每一个线程都有其对应的RunLoop B 默认非主线程的...RunLoop是没有运行的 C 在一个单独的线程中没有必要去启用RunLoop D 可以将NSTimer添加到runloop中 参考答案:C 理由:说到RunLoop,它可是多线程的法定。...但是非主线程通常来说就是为了执行某一任务的,执行完毕就需要归还资源,因此默认是不运行RunLoop的。NSRunLoop提供了一个添加NSTimer的方法,这个方法是在应用正常状态下会回调。...对象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环中的时候, ScrollView滚动过程中会因为mode的切换,而导致NSTimer将不再被调度...请写出NSTimer使用时的注意事项(两项即可) 思路和上一题一样,如果想要销毁timer,则必须先将timer置为失效,否则timer就一直占用内存而不会释放。造成逻辑上的内存泄漏。

    68110

    NSRunLoop-iOS中隐藏的大杀器

    - RunLoop的作用相当于在线程上维持一个类似while的死循环,在这个循环里内部不断的处理各种任务(比如:source/timer/Observer), 并且在不执行任务时,RunLoop 会让线程进入睡眠状态...- 每一个线程都有其对应的RunLoop,但是默认非主线程的RunLoop是没有运行的, (主线程上的RunLoop在App运行时由系统自动启动),需要为RunLoop添加至少一个事件源, 然后去...如果想要在一个线程上 perform selector,那么这个目标线程必须有一个active run loop。对于你自己创建的线程,这就意味着你必须等到你明确启动了run loop后才会执行。...通过Observer监听RunLoop的状态 在主线程即将休眠时,释放自动释放池 在主线程即将唤醒时,再次创建自动释放池,并将之前的对象再次放入池中 RunLoop 和定时器 创建一个NSTimer定时器...有如下两种解决方案: 第一种: 设置RunLoop Mode,例如NSTimer,我们指定它运行于 NSRunLoopCommonModes ,这是一个Mode的集合。

    1.1K10

    对于一个运行时间为100n*n的算法,要使其在同一台机器上,在比一个运行时间为2^n的算法运行的很快,n的最小值是多少

    在《算法导论》第一部分练习中,有这样一道算法题: 1.2-3 对于一个运行时间为100n*n的算法,要使其在同一台机器上,在比一个运行时间为2^n的算法运行的很快,n的最小值是多少?...下面给出我自己的解题思路: 对于100n^2和2^n两个算法进行比较,我们可以这样做:对100n^2-2^n操作,如果结果小于0,那么此时的n就是我们所求的值。...针对这一思路给出以下算法实现: 1 /** 2 * 3 */ 4 package com.b510.algorithms; 5 6 /** 7 * 《算法导论》第一部分:练习1.2-3:对于一个运行时间为...100n^2的算法,要使其在同一台机器上,比一个运行时间为2^n的算 8 * 法运行得更快,n的最小值是多少?...public static void main(String[] args) { 16 getSum(); 17 } 18 19 /** 20 * 对于

    1.6K30

    面试iOS 机会在自己手中

    一、首页启动速度 启动过程中做的事情越少越好(尽可能将多个接口合并) 不在UI线程上作耗时的操作(数据的处理在子线程进行,处理完通知主线程刷新节目) 在合适的时机开始后台任务(例如在用户指引节目就可以开始准备加载的数据...对象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环中的时候, ScrollView滚动过程中会因为mode的切换,而导致NSTimer将不再被调度...当我们滚动的时候,也希望不调度,那就应该使用默认模式。但是,如果希望在滚动时,定时器也要回调,那就应该使用common mode。 15. NStimer准吗?谈谈你的看法?...方法: 1、在主线程中进行NSTimer操作,但是将NSTimer实例加到main runloop的特定mode(模式)中。...Mode,如果要让任何情况下都回调,则需要设置Mode为Common模式; 实质上,对于子线程的runloop默认是不存在的,因为苹果采用了懒加载的方式。

    54851

    iOS学习——浅谈RunLoop

    4.在子线程中,如果不主动获取Runloop的话,那么子线程内部是不会创建Runloop的。可以下载CFRunloopRef的源码,搜索_CFRunloopGet0,查看代码。...基本上说的就是NSTimer   NSTimer在实际开发中会出现不准的情况,出现这种情况的主要是NSTimer的初始化有两种方法如下,然后第一种方法会自动添加到当前的RunLoop中,并且RunLoop...的运行模式mode设置为kCFRunLoopDefaultMode,这种模式在界面被拖拽时运行mode变为UITrackingRunLoopMode,这时候defaultmode下的定时器就会停止工作,...一个mode里面可以添加多个NSTimer,也就是说以后当创建NSTimer的时候,可以指定它是在什么模式下运行的。...第一个参数:说明这是一个定时器 第四个参数:GCD的回调任务添加到那个队列中执行,如果是主队列则在主线程执行 */ dispatch_source_t timer

    73121

    RunLoop数据结构、RunLoop的实现机制、RunLoop的Mode、RunLoop与NSTimer和线程

    具备唤醒线程的能力 4、CFRunLoopTimer 基于时间的触发器,基本上说的就是NSTimer。在预设的时间点唤醒RunLoop执行回调。...当RunLoop运行在Mode1上时,是无法接受处理Mode2或Mode3上的Source、Timer、Observer事件的 总共是有五种CFRunLoopMode: kCFRunLoopDefaultMode...对于RunLoop而言最核心的事情就是保证线程在没有消息的时候休眠,在有消息时唤醒,以提高程序性能。RunLoop这个机制是依靠系统内核来完成的(苹果操作系统核心组件Darwin中的Mach)。...五、RunLoop与NSTimer 一个比较常见的问题:滑动tableView时,定时器还会生效吗?...把Timer添加到UITrackingRunLoopMode上并不能解决问题,因为这样在默认情况下就无法接受定时器事件了。

    64040

    iOS开发中解决UIScrollView滚动时NSTimer失效的问题

    版权声明:本文为博主原创文章,未经博主允许不得转载。...https://blog.csdn.net/u010105969/article/details/70037932 我不知道大家在使用NSTimer的时候有没有发现如果我们滑动ScrollView...我曾经遇到过这样的问题,但需求是即使滑动scrollView,NSTimer也不能失效,于是就好好地研究了下这个问题。最终发现是NSTimer选择的一个模式的问题。...在选择这个默认的模式之后,如果我们不与UI进行交互那么NSTimer是有效的,如果我们与UI进行交互那么主线程runloop就会转到UITrackingRunLoopMode模式下,不能处理定时器,从而定时器失效...2.开启一个新的线程,让定时器在新的线程中进行定义,这时定时器就会被子线程中的runloop处理。

    1.4K20

    iOS面试题:RunLoop剖析

    具备唤醒线程的能力 4、CFRunLoopTimer 基于时间的触发器,基本上说的就是NSTimer。在预设的时间点唤醒RunLoop执行回调。...当RunLoop运行在Mode1上时,是无法接受处理Mode2或Mode3上的Source、Timer、Observer事件的 总共是有五种CFRunLoopMode: kCFRunLoopDefaultMode...对于RunLoop而言最核心的事情就是保证线程在没有消息的时候休眠,在有消息时唤醒,以提高程序性能。RunLoop这个机制是依靠系统内核来完成的(苹果操作系统核心组件Darwin中的Mach)。...五、RunLoop与NSTimer 一个比较常见的问题:滑动tableView时,定时器还会生效吗?...把Timer添加到UITrackingRunLoopMode上并不能解决问题,因为这样在默认情况下就无法接受定时器事件了。

    84820

    iOS开发中创建定时器

    版权声明:本文为博主原创文章,未经博主允许不得转载。...,按钮上的秒数进行倒计时) 创建定时器的方式: 1.利用NSTimer 2.利用GCD中的dispatch_source_t 代码: 利用NSTimer创建定时器的代码: 方式一: (void)...) userInfo:nil repeats:YES]; // 添加到运行循环 NSRunLoopCommonModes:占位模式 主线程 [[NSRunLoop currentRunLoop]...方式一是将NSTimer添加到了主线程的runloop中,但添加的是NSRunLoopCommonModes模式下,如果是添加在NSDefaultRunLoopMode模式下那么当用户与页面进行交互的时候...方式二是开辟了一个子线程,在子线程的runloop中添加了NSTimer,此时即使模式是NSDefaultRunLoopMode,在用户与页面进行交互的时候,定时器依然有效。

    91020

    iOS开发·RunLoop源码与用法完全解析(输入源,定时源,观察者,线程间通信,端口间通信,NSPort,NSMessagePort,NSMachPort,NSPortMessage)

    这是因为,在 Runloop 中有多个运行模式,每次调用 RunLoop 的主函数__CFRunloopRun() 时,只能指定其中一个 Mode(称 CurrentMode)运行, 如果需要切换 Mode...selector也是特殊的基于自定义的源.理论上来说,允许在当前线程向任何线程上执行发送消息,和基于端口的源一样,执行selector请求会在目标线程上序列化,减缓许多在线程上允许多个方法容易引起的同步问题...,你需要让工作线程在签到的消息中发送自己的本地端口到主线程。...可能的问题: 1.我们经常会在应用中看到tableView 的header 上是一个横向ScrollView,一般我们使用NSTimer,每隔几秒切换一张图片。...执行的任务其实就是RunLoop去各个Mode里执行各个item。因为RunLoop是独立的两个,相互不会影响,所以在子线程添加timer,滑动视图时,timer能正常运行。

    2.5K20

    iOS面试题梳理(三)

    在某个方法中 self.name = _name,name = _name 它 们有区别吗,为什么?...对象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环中的时候, ScrollView滚动过程中会因为mode的切换,而导致NSTimer将不再被调度...使用NSTimer写出一个使用block显示(在UILabel上)秒表的代码 代码紧凑,传值、回调都很方便,省去了写代理的很多代码。...串行和并行:串行是多个任务按一定顺序执行,并行是多个任务同时执行; 代码是在分线程执行,在主线程嘟列中刷新UI。 多线程编程是防止主线程堵塞、增加运行效率的最佳方法。...Mode,如果要让任何情况下都回调,则需要设置Mode为Common模式; 实质上,对于子线程的runloop默认是不存在的,因为苹果采用了懒加载的方式。

    1.4K71

    深入理解RunLoop及在开发中的应用

    一.RunLoop定义 RunLoop:运行循环,简单的说就是处理线程事件和管理线程的一种机制。当子线程的事件结束时,runloop将会自动休眠,app主线程中的runloop处于一直唤醒状态。...2.RunLoop在第一次获取时创建,在线程结束时销毁;只能在一个线程的内部获取其 RunLoop(主线程除外)。...当我们点击运行,系统运行 UIApplicationMain 函数,系统进入了:主线程 main 的运行循环。RunLoop 使得主线程一直处在运行循环中。...函数中,开启了一个和主线程相关的 RunLoop,让 UIApplicationMain 不会返回,一直在运行中,也就保证了程序的持续运行。...解决NSTimer在UIScrollView滑动时停止工作的问题 默认情况下,在滚动 tableView、UIScrollView 的时候,NSTimer会停止工作,这是因为在滚动时,RunLoop

    1.3K20

    RunLoop 总结:RunLoop的应用场景(二)让Timer正常运转

    上一篇讲了使用RunLoop保证子线程的长时间存活,而不是执行完任务后就立刻销毁的应用场景。这一篇就讲述一下RunLoop如何保证NSTimer在视图滑动时,依然能正常运转。...维基百科中的Event loop(可以看看这篇文章了解一下事件循环) 使用场景 1.我们经常会在应用中看到tableView 的header 上是一个横向ScrollView,一般我们使用NSTimer...其他一些关于timer的坑 我们在子线程中使用timer,也可以解决上面的问题,但是需要注意的是把timer加入到当前runloop后,必须让runloop 运行起来,否则timer仅执行一次。...执行的任务其实就是RunLoop去各个Mode里执行各个item。因为RunLoop是独立的两个,相互不会影响,所以在子线程添加timer,滑动视图时,timer能正常运行。...总结 1、如果是在主线程中运行timer,想要timer在某界面有视图滚动时,依然能正常运转,那么将timer添加到RunLoop中时,就需要设置mode 为NSRunLoopCommonModes。

    68951

    iOS-RunLoop充满灵性的死循环

    因为他可以在我们需要的时候自己跑起来运行,在我们没有操作的时候就停下来休息。充分节省CPU资源,提高程序性能。 二....,我们发现只会打印开始,并不会打印结束,这说明在UIApplicationMain函数中,开启了一个和主线程相关的RunLoop,导致UIApplicationMain不会返回,一直在运行中,也就保证了程序的持续运行...和UITrackingRunLoopMode用,并不是一种真正的Mode Mode间的切换 我们平时在开发中一定遇到过,当我们使用NSTimer每一段时间执行一些事情时滑动UIScrollView,NSTimer...常驻线程 常驻线程的作用:我们知道,当子线程中的任务执行完毕之后就被销毁了,那么如果我们需要开启一个子线程,在程序运行过程中永远都存在,那么我们就会面临一个问题,如何让子线程永远活着,这时就要用到常驻线程...最后检验一下自己 你知道RunLoop吗 ? RunLoop的作用? RunLoop内部是怎么实现的? 自动释放池什么时候释放? 在开发中如何使用RunLoop?什么应用场景?

    1.6K80

    iOS底层原理总结 - RunLoop

    面试题 讲讲 RunLoop,项目中有用到吗? RunLoop内部实现逻辑? Runloop和线程的关系? timer 与 Runloop 的关系?...RunLoop可以在需要的时候自己跑起来运行,在没有操作的时候就停下来休息。充分节省CPU资源,提高程序性能。 二....,我们发现只会打印开始,并不会打印结束,这说明在UIApplicationMain函数中,开启了一个和主线程相关的RunLoop,导致UIApplicationMain不会返回,一直在运行中,也就保证了程序的持续运行...以下为Core Foundation中关于RunLoop的5个类 CFRunLoopRef - 获得当前RunLoop和主RunLoop CFRunLoopModeRef - RunLoop 运行模式...常驻线程 常驻线程的作用:我们知道,当子线程中的任务执行完毕之后就被销毁了,那么如果我们需要开启一个子线程,在程序运行过程中永远都存在,那么我们就会面临一个问题,如何让子线程永远活着,这时就要用到常驻线程

    1.4K70

    浅析RunLoop原理及其应用

    如果不杀掉APP则APP一直运行,就是因为RunLoop循环一直为开启状态保证主线程不会被摧毁。这也是RunLoop的作用之一保证线程不退出。...UIApplicationMain()函数方法会默认为主线程设置一个NSRunLoop对象,这个循环会随时监听屏幕上由用户触摸所带来的底层消息并将其传递给主线程去处理,当点击一个button事件的传递从图上的调用栈可以看出...UITextView当用户滑动UITextView时验证码的倒计时是停止的,这是因为主线程的RunLoop模式是UI模式这个时候RunLoop循环是优先处理UI模式的任务而忽略了默认模式的计时器。...正确方法是采用 RunLoop 监听,将多个耗时操作分开执行,在每次 RunLoop 唤醒时去做一个耗时任务。 ?...所以这里可以再次优化,将模式改为kCFRunLoopCommonModes,这样的话滑动或者不滑动都可以加载图片渲染屏幕,而且是在不影响屏幕流畅性的基础上。如以下GIF: ?

    97420

    自欺欺人的使用 NSTimer 销毁

    :@selector(timerAction:) userInfo:nil repeats:YES]; 第一种缺陷如果当前线程就是主线程,也就是UI线程时,某些UI事件,比如UIScrollView的拖动操作...] addTimer:self.timer forMode:NSRunLoopCommonModes]; 以上两种方式都是在主线程上创建的,如果在子线程创建的timer,加入到runloop则需要手动开启...此时我们就会想把 Target 设置为 weakSelf ,运行后也不起作用. 是由于我们的 self 和 weakSelf 都是指针指向控制器,控制器的dealloc需要timer的销毁才调用。...此时我们又想到下面那种把timer设为weak,此时是直接运行造成坏内存访问,因为timer创建就销毁 @property (nonatomic , strong) NSTimer *timer; self.timer...(10.0), watchos(3.0), tvos(10.0)); 自定义分类创建NSTimer,适用于iOS 10以前 原理等同于以上方法,把 target 转换为 NSTimer 自身然后把控制器的定时器方法在

    47460
    领券