zoukankan      html  css  js  c++  java
  • [iOS]使用GCD创建定时器

    NSTimer基于runloop,如果runloop的任务过于繁重,可能会导致NSTimer不准时。

    使用GCD创建的定时器基于系统内核,不依赖runloop,相较于NSTimer更加准时。

    @interface ViewController ()
    @property (nonatomic,strong) dispatch_source_t timer;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        
        self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
        
        dispatch_source_set_timer(self.timer,
                                  dispatch_time(DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC),
                                  1.0 * NSEC_PER_SEC,
                                  0);
        
        dispatch_source_set_event_handler(self.timer, ^{
            NSLog(@"%s",__func__);
        });
        
        dispatch_resume(self.timer);
    }

    dispatch_source_create方法的第四个参数为定时器执行回调方法所在的队列

    API_AVAILABLE(macos(10.6), ios(4.0))
    DISPATCH_EXPORT DISPATCH_MALLOC DISPATCH_RETURNS_RETAINED DISPATCH_WARN_RESULT
    DISPATCH_NOTHROW
    dispatch_source_t
    dispatch_source_create(dispatch_source_type_t type,
        uintptr_t handle,
        uintptr_t mask,
        dispatch_queue_t _Nullable queue);

    dispatch_source_set_timer方法的第二个参数为定时器开始时间,第三个参数为执行间隔,第四个参数为误差,单位为纳秒。

    API_AVAILABLE(macos(10.6), ios(4.0))
    DISPATCH_EXPORT DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
    void
    dispatch_source_set_timer(dispatch_source_t source,
        dispatch_time_t start,
        uint64_t interval,
        uint64_t leeway);

    回调方式除了block以外,还可以使用函数进行回调

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        
        self.timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
        
        dispatch_source_set_timer(self.timer,
                                  dispatch_time(DISPATCH_TIME_NOW, 1.0 * NSEC_PER_SEC),
                                  1.0 * NSEC_PER_SEC,
                                  0);
        
        dispatch_source_set_event_handler_f(self.timer, func);
        
        dispatch_resume(self.timer);
    }
    
    void func (void *p)
    {
        NSLog(@"%s",__func__);
    }

    如果需要手动停止定时器:

    dispatch_source_cancel(self.timer);

  • 相关阅读:
    真正的e时代
    在线手册
    UVA 10616 Divisible Group Sums
    UVA 10721 Bar Codes
    UVA 10205 Stack 'em Up
    UVA 10247 Complete Tree Labeling
    UVA 10081 Tight Words
    UVA 11125 Arrange Some Marbles
    UVA 10128 Queue
    UVA 10912 Simple Minded Hashing
  • 原文地址:https://www.cnblogs.com/EverNight/p/14885953.html
Copyright © 2011-2022 走看看