美文网首页程序员
iOS定时器的三种方法

iOS定时器的三种方法

作者: Mr姜饼 | 来源:发表于2019-03-26 10:28 被阅读0次

    说到定时器  也许大家并不陌生,可能大家都只是对NSTimer比较熟悉吧,那么久来为大家介绍另外两种不常见的方法吧

    1.NSTimer(详细的就不给大家介绍了)

    + (NSTimer*)timerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation*)invocation repeats:(BOOL)yesOrNo;

    + (NSTimer*)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullableid)userInfo repeats:(BOOL)yesOrNo;

    注意:上面俩方法创建的timer需要将timer注册到NSRunloop中才能开启定时器的功能

        [[NSRunLoop currentRunLoop] addTimer:timer:forMode:NSRunLoopCommonModes];

    + (NSTimer*)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullableid)userInfo repeats:(BOOL)yesOrNo;

    + (NSTimer*)scheduledTimerWithTimeInterval:(NSTimeInterval)ti invocation:(NSInvocation*)invocation repeats:(BOOL)yesOrNo;

    ps:默认将timer添加到当前runloop中了,所有无需添加

    2. dispatch_source_create()

    简单地分为几个步骤 下面慢慢来讲解

    注意:这里创建的timer并需要设置为全局属性,因为GCD会自动管理内存,当回收的时候,你发现timer不起作用,就很尴尬了😂

    @property  (nonamatic , strong ) dispatch_source_t  timer;

      _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());

        dispatch_source_set_timer(_timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 1 * NSEC_PER_SEC );

        dispatch_source_set_event_handler(_timer, ^{

            flag ++;

            NSLog(@"flag = %d",flag);

        });

    添加执行事件代码。

        dispatch_resume(_timer);

    手动触发

    3.CADisplayLink

    CADispalyLink displayLink = [CADisplayLink displayLinkWithTarget:selfselector:@selector(handleDisplayLink:)];

     [displayLink addToRunLoop:[NSRunLoopcurrentRunLoop] forMode:NSDefaultRunLoopMode];  

    较为精准,与屏幕刷新帧率同步,多用户视图渲染或绘图

    相关文章

      网友评论

        本文标题:iOS定时器的三种方法

        本文链接:https://www.haomeiwen.com/subject/zqwwvqtx.html