ios定时器

RunLoop 总结及应用

纵饮孤独 提交于 2020-03-20 03:04:20
什么是RunLoop 注释:和ppt上总结的一样 和代码一块去理解 从字面上看 运行循环 跑圈 循环 基本作用 保持程序的持续运行(比如主运行循环) 处理App中的各种事件(比如触摸事件、定时器事件、Selector事件) 节省CPU资源,提高程序性能:该做事时做事,该休息时休息 存在价值 没有RunLoop 有RunLoop main函数中的RunLoop(主运行循环) 主运行循环 第14行代码的UIApplicationMain函数内部就启动了一个RunLoop 所以UIApplicationMain函数一直没有返回,保持了程序的持续运行 这个默认启动的RunLoop是跟主线程相关联的 RunLoop对象 iOS中有2套API来访问和使用RunLoop Foundation NSRunLoop Core Foundation CFRunLoopRef NSRunLoop和CFRunLoopRef都代表着RunLoop对象 NSRunLoop是基于CFRunLoopRef的一层OC包装,所以要了解RunLoop内部结构,需要多研究CFRunLoopRef层面的API(Core Foundation层面) RunLoop资料 苹果官方文档 https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual

iOS 定时器的比较

荒凉一梦 提交于 2020-02-11 05:57:23
然而,在iOS中有很多方法完成以上的任务,到底有多少种方法呢?经过查阅资料,大概有三种方法:NSTimer、CADisplayLink、GCD。接下来我就一一介绍它们的用法。 一、NSTimer 1. 创建方法 1 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(action:) userInfo:nil repeats:NO]; TimerInterval : 执行之前等待的时间。比如设置成1.0,就代表1秒后执行方法 target : 需要执行方法的对象。 selector : 需要执行的方法 repeats : 是否需要循环 2. 释放方法 1 [timer invalidate]; 注意 : 调用创建方法后,target对象的计数器会加1,直到执行完毕,自动减1。如果是循环执行的话,就必须手动关闭,否则可以不执行释放方法。 3. 特性 存在延迟 不 管是一次性的还是周期性的timer的实际触发事件的时间,都会与所加入的RunLoop和RunLoop Mode有关,如果此RunLoop正在执行一个连续性的运算,timer就会被延时出发。重复性的timer遇到这种情况,如果延迟超过了一个周期,则 会在延时结束后立刻执行

GCD实现多个定时器,完美避过NSTimer的三大缺陷(RunLoop、Thread、Leaks)

落花浮王杯 提交于 2020-02-11 01:04:39
定时器在我们每个人做的iOS项目里面必不可少,如登录页面倒计时、支付期限倒计时等等,一般来说使用NSTimer创建定时器: + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo; + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo; But 使用NSTimer需要注意一下几点: 1、必须保证有一个活跃的RunLoop。 系统框架提供了几种创建NSTimer的方法,其中以scheduled开头的方法会自动把timer加入当前RunLoop,到了设定时间就会触发selector方法,而没有scheduled开头的方法则需要手动添加timer到一个RunLoop中才会有效。程序启动时,会默认启动主线程的RunLoop并在程序运行期内有效

iOS开发拓展篇—音频处理(音乐播放器5)

做~自己de王妃 提交于 2020-01-20 03:03:14
iOS开发拓展篇—音频处理(音乐播放器5) 实现效果: 一、半透明滑块的设置 1 /** 2 *拖动滑块 3 */ 4 - (IBAction)panSlider:(UIPanGestureRecognizer *)sender { 5 6 //1.获得挪动的距离 7 CGPoint t=[sender translationInView:sender.view]; 8 //把挪动清零 9 [sender setTranslation:CGPointZero inView:sender.view]; 10 11 //2.控制滑块和进度条的frame 12 CGFloat sliderMaxX=self.view.width-self.slider.width; 13 self.slider.x+=t.x; 14 //控制滑块的frame,不让其越界 15 if(self.slider.x<0) 16 { 17 self.slider.x=0; 18 }else if (self.slider.x>sliderMaxX) 19 { 20 self.slider.x=sliderMaxX; 21 } 22 //设置进度条的宽度 23 self.progressView.width=self.slider.center.x; 24 25 //3.设置时间值 26 double

[iOS Animation]-CALayer 定时器动画

雨燕双飞 提交于 2019-12-29 22:25:10
定时器的动画 我可以指导你,但是你必须按照我说的做。 -- 骇客帝国 在第10章“缓冲”中,我们研究了 CAMediaTimingFunction ,它是一个通过控制动画缓冲来模拟物理效果例如加速或者减速来增强现实感的东西,那么如果想更加真实地模拟物理交互或者实时根据用户输入修改动画改怎么办呢?在这一章中,我们将继续探索一种能够允许我们精确地控制一帧一帧展示的基于定时器的动画。 定时帧 动画看起来是用来显示一段连续的运动过程,但实际上当在固定位置上展示像素的时候并不能做到这一点。一般来说这种显示都无法做到连续的移动,能做的仅仅是足够快地展示一系列静态图片,只是看起来像是做了运动。 我们之前提到过iOS按照每秒60次刷新屏幕,然后 CAAnimation 计算出需要展示的新的帧,然后在每次屏幕更新的时候同步绘制上去, CAAnimation 最机智的地方在于每次刷新需要展示的时候去计算插值和缓冲。 在第10章中,我们解决了如何自定义缓冲函数,然后根据需要展示的帧的数组来告诉 CAKeyframeAnimation 的实例如何去绘制。所有的Core Animation实际上都是按照一定的序列来显示这些帧,那么我们可以自己做到这些么? NSTimer 实际上,我们在第三章“图层几何学”中已经做过类似的东西,就是时钟那个例子,我们用了 NSTimer 来对钟表的指针做定时动画

定时帧(基于定时器的动画 11.1)

我只是一个虾纸丫 提交于 2019-12-29 22:24:24
定时帧 动画看起来是用来显示一段连续的运动过程,但实际上当在固定位置上展示像素的时候并不能做到这一点。一般来说这种显示都无法做到连续的移动,能做的仅仅是足够快地展示一系列静态图片,只是看起来像是做了运动。 我们之前提到过iOS按照每秒60次刷新屏幕,然后 CAAnimation 计算出需要展示的新的帧,然后在每次屏幕更新的时候同步绘制上去, CAAnimation 最机智的地方在于每次刷新需要展示的时候去计算插值和缓冲。 在第10章中,我们解决了如何自定义缓冲函数,然后根据需要展示的帧的数组来告诉 CAKeyframeAnimation 的实例如何去绘制。所有的Core Animation实际上都是按照一定的序列来显示这些帧,那么我们可以自己做到这些么? NSTimer 实际上,我们在第三章“图层几何学”中已经做过类似的东西,就是时钟那个例子,我们用了 NSTimer 来对钟表的指针做定时动画,一秒钟更新一次,但是如果我们把频率调整成一秒钟更新60次的话,原理是完全相同的。 我们来试着用 NSTimer 来修改第十章中弹性球的例子。由于现在我们在定时器启动之后连续计算动画帧,我们需要在类中添加一些额外的属性来存储动画的 fromValue , toValue , duration 和当前的 timeOffset (见清单11.1)。 清单11.1 使用 NSTimer

[iOS Animation]-CALayer 定时器动画演示一

不打扰是莪最后的温柔 提交于 2019-12-10 07:59:28
定时器的动画 我可以指导你,但是你必须按照我说的做。 -- 骇客帝国 在第10章“缓冲”中,我们研究了 CAMediaTimingFunction ,它是一个通过控制动画缓冲来模拟物理效果例如加速或者减速来增强现实感的东西,那么如果想更加真实地模拟物理交互或者实时根据用户输入修改动画改怎么办呢?在这一章中,我们将继续探索一种能够允许我们精确地控制一帧一帧展示的基于定时器的动画。 定时帧 动画看起来是用来显示一段连续的运动过程,但实际上当在固定位置上展示像素的时候并不能做到这一点。一般来说这种显示都无法做到连续的移动,能做的仅仅是足够快地展示一系列静态图片,只是看起来像是做了运动。 我们之前提到过iOS按照每秒60次刷新屏幕,然后 CAAnimation 计算出需要展示的新的帧,然后在每次屏幕更新的时候同步绘制上去, CAAnimation 最机智的地方在于每次刷新需要展示的时候去计算插值和缓冲。 在第10章中,我们解决了如何自定义缓冲函数,然后根据需要展示的帧的数组来告诉 CAKeyframeAnimation 的实例如何去绘制。所有的Core Animation实际上都是按照一定的序列来显示这些帧,那么我们可以自己做到这些么? NSTimer 实际上,我们在第三章“图层几何学”中已经做过类似的东西,就是时钟那个例子,我们用了 NSTimer 来对钟表的指针做定时动画

iOS 定时器

↘锁芯ラ 提交于 2019-12-07 01:23:17
iOS里面使用的定时器类型一般有三种NSTimer、CADisplayLink、GCD。 1、最精准的定时器 - GCD #import "ViewController.h" @interface ViewController () // 必须要有强引用,不然对象会被释放 @property (nonatomic , strong) dispatch_source_t timer ; @end @implementation ViewController -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ NSLog(@"__%s__",__func__); #warning 重复执行的GCD定时器 // 1、基于GCD的定时器,创建timer对象: // 参数一:source的类型DISPATCH_SOURCE_TYPE_TIMER 表示定时器类型 // 参数二:描述内容,比如线程ID // 参数三:详细描述内容 // 参数四:队列,决定GCD的队列在哪个线程执行 dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0

iOS NSTimer 定时器用法总结

浪尽此生 提交于 2019-12-06 11:18:43
NSTimer在IOS开发中会经常用到,尤其是小型游戏,然而对于初学者时常会注意不到其中的内存释放问题,将其基本用法总结如下: 一、初始化方法:有五种初始化方法,分别是 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation *)invocation repeats:(BOOL)yesOrNo; - (void)viewDidLoad { [super viewDidLoad]; //初始化一个Invocation对象 NSInvocation * invo = [NSInvocation invocationWithMethodSignature:[[self class] instanceMethodSignatureForSelector:@selector(init)]]; [invo setTarget:self]; [invo setSelector:@selector(myLog)]; NSTimer * timer = [NSTimer timerWithTimeInterval:1 invocation:invo repeats:YES]; //加入主循环池中 [[NSRunLoop mainRunLoop]addTimer:timer forMode