美文网首页
iOS 中定时器小记

iOS 中定时器小记

作者: 野猪哥123 | 来源:发表于2018-09-03 22:45 被阅读23次

1.iOS 中定时器的解决方案?

(1).CADisplayLink

使用简单,代码简洁,和屏幕刷帧频率相同,使用时需要注意循环引用问题,由于依赖 RunLoop 来实现定时功能.所以需要手动添加到 RunLoop 中.

(2).NSTimer

NSTimer 是我们项目中经常使用到的定时器的一种方案,同样也需要注意循环引用问题, NSTimer 和CADisplayLink一样,需要依赖 RunLopp,所以也需要手动添加到 RunLoop 中,需要注意的是,使用 NSTimer 的类方法scheduledTimerWithTimeInterval:创建 NSTimer 时,会自动添加到当前的 RunLoop 中.

(3).GCD

C语言的一套实现定时任务的方案,代码相对较多,使用较繁琐

*使用CADisplayLink和NSTimer过程中出现的循环引用的问题可以通过NSProxy来解决

*相对于CADisplayLink和NSTimer, GCD不依赖于 RunLoop, 和系统内核直接挂钩,所以具有更高的准时性,万一 RunLoop 处理的事情很多,就会造成CADisplayLink和NSTimer的不准确.

2.使用GCD简单自定义的定时器

 下面是使用GCD 实现的定时器,可以直接拿来用.

#import

@interfaceMRTimer :NSObject

+(NSString*)doTask:(void(^)(void))task

        start:(NSTimeInterval)start

     interval:(NSTimeInterval)interval

       repeat:(BOOL)repeat

        async:(BOOL)async;

+(NSString*)doTask:(id)target

           selector:(SEL)selector

              start:(NSTimeInterval)start

           interval:(NSTimeInterval)interval

             repeat:(BOOL)repeat

              async:(BOOL)async;

+(void)cancelTask:(NSString*)name;

@end

#import "MRTimer.h"

@implementation MRTimer

static NSMutableDictionary *timers_;

dispatch_semaphore_t semaphore_;

+(void)initialize{

    staticdispatch_once_tonceToken;

    dispatch_once(&onceToken, ^{

        timers_=@{}.mutableCopy;

        semaphore_ = dispatch_semaphore_create(1);

    });

}

+(NSString*)doTask:(void(^)(void))task

        start:(NSTimeInterval)start

     interval:(NSTimeInterval)interval

       repeat:(BOOL)repeat

        async:(BOOL)async{

    if(!task || start <0|| (interval <=0&& repeat))returnnil;

    dispatch_queue_tqueue = async

    ?dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)

    :dispatch_get_main_queue();

    dispatch_source_ttimer =dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,0,0, queue);

    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, start * NSEC_PER_SEC, interval * NSEC_PER_SEC);

    dispatch_semaphore_wait(semaphore_, DISPATCH_TIME_FOREVER);

    NSString*name = [NSStringstringWithFormat:@"%lu",(unsignedlong)timers_.count];

    timers_[name] = timer;

    dispatch_semaphore_signal(semaphore_);

    dispatch_source_set_event_handler(timer, ^{

        task();

        if(!repeat) {

            dispatch_source_cancel(timer);

        }

    });

    dispatch_resume(timer);

    returnname;

}

+(NSString*)doTask:(id)target

           selector:(SEL)selector

              start:(NSTimeInterval)start

           interval:(NSTimeInterval)interval

             repeat:(BOOL)repeat

              async:(BOOL)async{

    if(!target || !selector)returnnil;

    return [self doTask:^{

        if([targetrespondsToSelector:selector]) [targetperformSelector:selector];

    }start:startinterval:intervalrepeat:repeatasync:async];

}

+(void)cancelTask:(NSString*)name{

    if(name.length==0)return;

    dispatch_semaphore_wait(semaphore_, DISPATCH_TIME_FOREVER);

    dispatch_source_ttimer =timers_[name];

    if(!timer)return;

    dispatch_source_cancel(timer);

    [timers_ removeObjectForKey:name];

    dispatch_semaphore_signal(semaphore_);

}

@end

相关文章

  • iOS进阶-谈谈定时器

    目录 iOS提供定时器API 定时器开发中的坑 一、 iOS提供定时器API 二、定时器开发中的坑 2.1、必须办...

  • iOS 中定时器小记

    1.iOS 中定时器的解决方案? (1).CADisplayLink 使用简单,代码简洁,和屏幕刷帧频率相同,使用...

  • iOS中的定时器

    点击这里>> cocoaChina: iOS中的定时器 iOS中定时器有三种,分别是NSTimer、CADispl...

  • GCD定时器使用

    iOS中的常用定时器分为这几类: NSTimer CADisplayLink GCD定时器 选择GCD定时器原因:...

  • iOS:NSTimer的几种创建方式

    在iOS开发中,经常会用到定时器,iOS中常用的定时器有三种:NSTimer,GCD,CADisplayLink。...

  • 定时器的使用介绍

    iOS中的定时器大致分为这几类: NSTimer CADisplayLink GCD定时器 (一)NSTimer ...

  • iOS Timer

    iOS开发中定时器经常会用到,iOS中常用的定时器有三种,分别是NSTime,CADisplayLink和GCD。...

  • iOS三大定时器

    iOS开发中定时器经常会用到,iOS中常用的定时器有三种,分别是NSTime,CADisplayLink和GCD。...

  • 无标题文章

    iOS NSTimer使用详解-开启、关闭、移除 定时器定时器详解ios定时器关闭定时器NSTimer 1、要使用...

  • Flutter 网络请求类封装及搜索框实现

    Flutter 中定时器的使用 在 Flutter 中定时器相对 iOS 来说比较好的一点就是定时器事件的执行不会...

网友评论

      本文标题:iOS 中定时器小记

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