首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

内存管理(3)

内存管理(3)

2.GCD定时器

    NSTimer依赖于RunLoop,如果RunLoop的任务过于繁重,可能会导致NSTimer不准时

为什么不准确呢?因为它基于runloop,runloop每跑一圈都需要耗时间,而且时间不会一样。
比如定时器是1s执行一次。runloop跑一圈是0.2s,发现还不到1s,继续跑。下一次跑了0.9s,发现是1.1s了,就去执行NSTimer,导致NSTimer不准确。

    而GCD的定时器会更加准时

因为他不基于NSRunloop

        dispatch_queue_t queue = dispatch_queue_create("timer", DISPATCH_QUEUE_SERIAL);
        
        // 创建定时器
        dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
        
        // 设置时间
        uint64_t start = 2.0; // 2秒后开始执行
        uint64_t interval = 1.0; // 每隔1秒执行
        dispatch_source_set_timer(timer,
                                  dispatch_time(DISPATCH_TIME_NOW, start * NSEC_PER_SEC),
                                  interval * NSEC_PER_SEC, 0);
        
        // 设置回调
        //    dispatch_source_set_event_handler(timer, ^{
        //        NSLog(@"1111");
        //    });
        dispatch_source_set_event_handler_f(timer, timerFire);
        
        // 启动定时器
        dispatch_resume(timer);
        
        self.timer = timer;
返回列表