随笔 - 400,  文章 - 0,  评论 - 7,  阅读 - 21万

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
复制代码

 

posted on   懂事长qingzZ  阅读(186)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示