runloop 和 CFRunLoop - 定时器 - NSTimer 和 GCD定时器

1.

2、

  1 #import "ViewController.h"
  2
  3 @interface ViewController ()
  4 @property (nonatomic, strong) dispatch_source_t timer;
  5 @end
  6
  7 @implementation ViewController
  8
  9 -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
 10     [self gcdTimer];
 11 }
 12
 13
 14 /**
 15  GCD定时器
 16  */
 17 -(void)gcdTimer{
 18
 19
 20     /**
 21       DISPATCH_SOURCE_TYPE_TIMER 定时器
 22       0 描述信息
 23       0 更详细的描述信息
 24       dispatchQueue : 队列决定定时器任务在哪个线程
 25      */
 26 //    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
 27     dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_global_queue(0, 0));
 28
 29     /*
 30      DISPATCH_TIME_NOW :起始时间
 31      intervalInSeconds 间隔时间
 32      leewayInSeconds 精准度, 绝对精准0
 33      */
 34     dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC, 0 * NSEC_PER_SEC);
 35
 36     /*
 37      定时器任务
 38      */
 39     dispatch_source_set_event_handler(timer, ^{
 40         NSLog(@"=== %@", [NSThread currentThread]);
 41     });
 42     dispatch_resume(timer);
 43
 44     /*
 45      此时 定时器不会工作, 因为定时器有可能被释放掉了,异步线程和主线程都不会执行 ,需要强引用, strong,
 46      GCD定时器是绝对精准的,拖拽tableview或者textview都会执行,NSTimer 分界面追踪模式和默认模式
 47      */
 48
 49     self.timer = timer;
 50 }
 51
 52 -(void)runloopTimer{
 53     NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(runTimer) userInfo:nil repeats:YES];// 在主线程
 54
 55     // NSRunLoopCommonModes:会同时执行默认模式(NSDefaultRunLoopMode)和界面追踪模式(UITrackingRunLoopMode)
 56     [[NSRunLoop currentRunLoop] addTimer:timer forMode:UITrackingRunLoopMode]; // 等价于 CFRunLoopAddTimer (参数1,参数2,参数3)
 57 }
 58 - (void)runloopTimer22{
 59     NSRunLoop *runloop = [NSRunLoop currentRunLoop];
 60
 61     /**
 62      默认是NSDefaultRunLoopMode
 63      */
 64     [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(runTimer) userInfo:nil repeats:YES];
 65     [runloop run];
 66 }
 67
 68
 69 -(void)runTimer{
 70     NSLog(@"===%@====",[NSThread currentThread]);
 71 }
 72
 73 -(void)runLoop{
 74     //主线程runloop
 75     NSRunLoop *mainRunloop = [NSRunLoop mainRunLoop];
 76     NSLog(@"mainRunloop =========== %p", mainRunloop);
 77     //    NSLog(@"mainRunloop 是个啥 === %@", mainRunloop);//打印一坨东西看不明白
 78
 79     //当前线程runloop
 80     NSRunLoop * currentRunLoop = [NSRunLoop currentRunLoop];
 81     NSLog(@"currentRunLoop ======== %p", currentRunLoop);
 82
 83     //core
 84     NSLog(@"CFRunLoopGetMain ====== %p", CFRunLoopGetMain());
 85     NSLog(@"CFRunLoopGetCurrent === %p", CFRunLoopGetCurrent());
 86
 87     //转换
 88     NSLog(@"mainRunloop.getCFRunLoop  === %p", mainRunloop.getCFRunLoop);
 89     NSLog(@"currentRunLoop .getCFRunLoop  === %p", currentRunLoop.getCFRunLoop);
 90     /*
 91      2018-07-06 13:52:44.552563+0800 10 - runloop[12596:484429] mainRunloop =========== 0x6040000a2be0
 92      2018-07-06 13:52:44.552908+0800 10 - runloop[12596:484429] currentRunLoop ======== 0x6040000a2be0
 93      2018-07-06 13:52:44.553043+0800 10 - runloop[12596:484429] CFRunLoopGetMain ====== 0x6000001f3600
 94      2018-07-06 13:52:44.553121+0800 10 - runloop[12596:484429] CFRunLoopGetCurrent === 0x6000001f3600
 95      */
 96 }
 97
 98
 99
100 @end

原文地址:https://www.cnblogs.com/qingzZ/p/9283001.html

时间: 2024-10-19 15:59:37

runloop 和 CFRunLoop - 定时器 - NSTimer 和 GCD定时器的相关文章

GCD dispatch_source基本使用,创建GCD定时器与NSTimer的区别

可以使用GCD创建定时器 创建定时器: dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue); self.timer = timer; // 定时任务调度设置,4秒后启动,每个5秒运行 dispat

页面实现多个定时器(计时器)时选用NSTimer还是GCD

这里讲述的是页面实现多个定时器(计时器)时选用NSTimer还是GCD?(干货不湿)的文章,具体方法请看介绍 定时器在我们每个人做的iOS项目里面必不可少,如登录页面倒计时.支付期限倒计时等等,一般来说使用NSTimer创建定时器: + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repea

IOS GCD定时器

提到定时器,NStimer肯定是我们最为熟悉的. 但是NStimer有着很大的缺点,并不准确. 通俗点说,就是它该做他的事了,但是由于其他事件的影响,Nstimer会放弃他应该做的. 而GCD定时器,是不会发生这种事情的. GCD严格按照规定好的规格去做事. 前面介绍RunLoop 的时候已经介绍了NSTimer. 这里就不在介绍了. 在这里着重介绍一下GCD定时器. 首先,我们知道NStimer是在RunLoop的基础上执行的,然而RunLoop是在GCD基础上实现的,所以说GCD可算是更加高

【转】iOS中定时器NSTimer的使用

原文网址:http://www.cnblogs.com/zhulin/archive/2012/02/02/2335866.html 1.初始化 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo; + (NSTimer *)scheduledTimerWithTime

定时器(NSTimer)

iOS中定时器NSTimer的使用 1.初始化 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo; + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget se

定时器NSTimer放在主线程中如何解决与其他UI控件的冲突

在ios应用中  当定时器NSTimer在主线程中,可能会与其他UI控件产生冲突,比如广告栏的自动滚动,比如在当前页面中有一个textView,滚动时可能会导致定时器停止,这是为什么呢? 因为同在主线程中,系统会优先处理用户的拖动,那么就造成定时器的卡住 停止现象,怎么做呢? 需要把定时器NSTimer对象 放到 RunLoop循环中,就可以解决这个问题. [[NSRunLoop mainRunLoop]addTimer: self.timer toMode:NSRunLoopCommomMod

ios基础篇(二十三)—— 定时器NSTimer与图片的自动切换

一.NSTimer NSTimer是一个能在从现在开始到后面的某一个时刻或者周期性的执行我们指定的方法的对象.可以按照一定的时间间隔,将制定的信息发送给目标对象.并更新某个对象的行为.你可以选择在未来的某个时间将它停止.开启.甚至销毁. 1.NSTimer的创建 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo

iOS定时器NSTimer的使用方法

1.初始化 + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)yesOrNo; + (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelec

定时器NSTimer

如果我们想让某个方法重复的执行,可以用ios提供的定时器NSTimer来完成,其实使用起来非常简单,分为三个步骤: 一.调用NSTimer scheduledTimerWithTimeInterval::target:: selector::userInfo::repeats或者scheduledTimerWithTimeInterval:invocation:repeats类方法来创建NSTimer对象. 其中的参数: timeInterval:指定每隔多少秒执行一次任务 invocation