美文网首页
iOS GCD定时器封装

iOS GCD定时器封装

作者: 无名指的情怀 | 来源:发表于2020-06-25 20:48 被阅读0次

GCD定时器封装

简单调用

[ZFTimer execTask:^{

        NSLog(@"1111111 - %@",[NSThread currentThread]);

    }start:2 interval:1 repeats:YES async:YES];

@interface ZFTimer : NSObject

/// 启动定时器

/// @param task 任务

/// @param start 开始时间

/// @param interval 重复时间间隔

/// @param repeats 是否重复

/// @param async 是否异步

+ (NSString*)execTask:(void(^)(void))taskstart:(NSTimeInterval)startinterval:(NSTimeInterval)intervalrepeats:(BOOL)repeatsasync:(BOOL)async;

+ (NSString*)execTask:(id)targetselector:(SEL)selectorstart:(NSTimeInterval)startinterval:(NSTimeInterval)intervalrepeats:(BOOL)repeatsasync:(BOOL)async;

/// 取消定时器

/// @paramname 定时器标识

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

@end


@implementation ZFTimer

static NSMutableDictionary *times;

dispatch_semaphore_t semaphore;

+ (void)initialize {

    staticdispatch_once_tonceToken;

    dispatch_once(&onceToken, ^{

        times = [NSMutableDictionary dictionary];

        semaphore = dispatch_semaphore_create(1);

    });

}

+ (NSString*)execTask:(void(^)(void))taskstart:(NSTimeInterval)startinterval:(NSTimeInterval)intervalrepeats:(BOOL)repeatsasync:(BOOL)async {

    if(!task) {

        returnnil;

    }

    //队列

    dispatch_queue_t queue = async ? dispatch_get_global_queue(0, 0) : dispatch_get_main_queue();

    //创建定时器

    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER,0,0, queue);

    //设置时间

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

    //加锁

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    //定时器的唯一标识

    NSString*name = [NSStringstringWithFormat:@"%zd",times.count];

    //存放到字典中

    [timessetObject:timerforKey:name];

    dispatch_semaphore_signal(semaphore);

    //设置回调

    dispatch_source_set_event_handler(timer, ^{

        task();

        if(!repeats) {//不重复的任务

            [selfcancelTask:name];

        }

    });

    //启动定时器

    dispatch_resume(timer);

    returnname;

}

+ (NSString*)execTask:(id)targetselector:(SEL)selectorstart:(NSTimeInterval)startinterval:(NSTimeInterval)intervalrepeats:(BOOL)repeatsasync:(BOOL)async {

    if(!target || !selector) {

        returnnil;

    }

    return[selfexecTask:^{

        #pragma clang diagnostic push

        #pragma clang diagnostic ignored"-Warc-performSelector-leaks"

        if([targetrespondsToSelector:selector]) {

            [targetperformSelector:selector];

        }

        #pragma clang diagnostic pop

    }start:startinterval:intervalrepeats:repeatsasync:async];

}

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

    if(name.length==0) {

        return;

    }

    dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);

    dispatch_source_ttimer =times[name];

    if(timer) {

        dispatch_source_cancel(timer);

        [times removeObjectForKey:name];

    }

    dispatch_semaphore_signal(semaphore);

}

@end

相关文章

  • iOS NSTimer 和 GCD 定时器及封装

    iOS NSTimer 和 GCD 定时器及封装 iOS NSTimer 不准时 NSTimer 内部是有 run...

  • GCD定时器封装

    前言 iOS开发中,经常需要使用到定时器,使用NSTimer很容易出现内存泄漏,在此简单封装GCD定时器。 1.定...

  • GCD定时器使用

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

  • iOS GCD定时器封装

    GCD定时器封装 简单调用 [ZFTimer execTask:^{ NSLog(@"1111111 - ...

  • iOS GCD定时器封装

    iOS 使用定时器,大多数人都会采用GCD方案。其中一个比较重要的原因是 GCD定时器不依赖RunLoop,没有N...

  • 定时器的使用介绍

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

  • iOS常用定时器误差分析

    iOS中常NSTimer、CADisplayLink、GCD定时器,其中NSTimer、CADisplayLink...

  • iOS 定时器

    iOS常用定时器有3种 NSTimer GCD定时器 dispatch_source_t CADisplayLin...

  • iOS:NSTimer的几种创建方式

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

  • iOS知识点之定时器

    iOS中常用的定时器有三种,分别是NSTimer,CADisplayLink和GCD。 NSTimer GCD定时...

网友评论

      本文标题:iOS GCD定时器封装

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