上一篇:Object-C定时器,封装GCD定时器的必要性!!! (一)

上一篇认识了Object-C中的几种定时器,这一篇将Dispatch定时器(GCD定时器)封装起来.

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; color: #d12f1b }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; min-height: 24.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; color: #008400 }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; color: #008400; min-height: 24.0px }
p.p6 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px "PingFang SC"; color: #008400 }
span.s1 { color: #78492a }
span.s2 { }
span.s3 { color: #bb2ca2 }
span.s4 { color: #703daa }
span.s5 { font: 20.0px "PingFang SC" }
span.s6 { font: 20.0px Menlo }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; color: #d12f1b }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; min-height: 24.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; color: #008400 }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; color: #008400; min-height: 24.0px }
p.p6 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px "PingFang SC"; color: #008400 }
p.p7 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; color: #bb2ca2 }
span.s1 { color: #78492a }
span.s2 { }
span.s3 { color: #bb2ca2 }
span.s4 { color: #703daa }
span.s5 { font: 20.0px "PingFang SC" }
span.s6 { font: 20.0px Menlo }

#import <Foundation/Foundation.h>

@interface DispatchTimer : NSObject

/**

创建dispatch定时器

@param timerName 定时器名称

@param interval 时间间隔

@param queue 运行的队列(默认为全局并发队列)

@param repeats 是否重复

@param action 执行的动作

*/

+ (void)scheduleDispatchTimerWithName:(NSString *)timerName

timeInterval:(double)interval

queue:(dispatch_queue_t)queue

repeats:(BOOL)repeats

action:(dispatch_block_t)action;

/**

取消dispatch定时器

@param timerName 定时器名称

*/

+ (void)cancelTimerWithName:(NSString *)timerName;

/**

取消所有创建的dispatch定时器

*/

+ (void)cancelAllTimer;

@end

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; color: #d12f1b }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; min-height: 24.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; color: #bb2ca2 }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; color: #703daa }
p.p6 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; color: #78492a }
p.p7 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; color: #008400 }
p.p8 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; color: #3d1d81 }
span.s1 { color: #78492a }
span.s2 { }
span.s3 { color: #000000 }
span.s4 { color: #bb2ca2 }
span.s5 { color: #703daa }
span.s6 { color: #4f8187 }
span.s7 { color: #3d1d81 }
span.s8 { color: #008400 }
span.s9 { font: 20.0px "PingFang SC"; color: #008400 }
span.s10 { color: #272ad8 }
span.s11 { font: 20.0px "PingFang SC" }
span.s12 { color: #31595d }

#import "DispatchTimer.h"

@implementation DispatchTimer

static NSMutableDictionary * timerContainer;

+ (void)initialize

{

timerContainer = [NSMutableDictionary dictionary];

}

+ (void)scheduleDispatchTimerWithName:(NSString *)timerName timeInterval:(double)interval queue:(dispatch_queue_t)queue repeats:(BOOL)repeats action:(dispatch_block_t)action

{

if (nil == timerName) {

     return;

}

if (nil == queue) {//默认为全局并发队列

queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

}

dispatch_source_t timer = [

timerContainer objectForKey:timerName];

if (nil == timer) {//创建

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

[timerContainer setObject:timer forKey:timerName];

//执行timer 一定放在这里 放下面会造成野地址

dispatch_resume(timer);

}

dispatch_time_t start = dispatch_time(DISPATCH_TIME_NOW, interval * NSEC_PER_SEC);

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

__weak typeof(self) weakSelf = self;

dispatch_source_set_event_handler(timer, ^{

action();

if (!repeats) {

[weakSelf cancelTimerWithName:timerName];

}

});

}

+ (void)cancelTimerWithName:(NSString *)timerName

{

dispatch_source_t timer = [timerContainer objectForKey:timerName];

if (nil == timer) {

      return;

}

[timerContainer removeObjectForKey:timerName];

dispatch_source_cancel(timer);

}

+ (void)cancelAllTimer

{

[timerContainer enumerateKeysAndObjectsUsingBlock:^(NSString * timerName,            dispatch_source_t timer, BOOL * _Nonnull stop) {

[timerContainer removeObjectForKey:timerName];

dispatch_source_cancel(timer);

}];

}

@end

为了方便调用:将定时器的创建、销毁方法设计为类方法。

有任何关于iOS开发的问题!欢迎下方留言!!!或者邮件lieryangios@126.com 虽然我不一定能够解答出来,但是我会请教iOS开发高手!!!解答您的问题!!!

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; min-height: 24.0px }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 20.0px Menlo; color: #bb2ca2 }
span.s1 { }

Object-C定时器,封装GCD定时器的必要性!!! (二)的更多相关文章

  1. Object-C定时器,封装GCD定时器的必要性!!! (一)

    实际项目开发中经常会遇到延迟某件任务的执行,或者让某件任务周期性的执行.然后也会在某些时候需要取消掉之前延迟执行的任务. iOS中延迟操作有三种解决方案: 1.NSObject的方法:(对象方法) p ...

  2. GCD定时器

    // // ViewController.m // GCD 定时器 // // #import "ViewController.h" NSInteger count = ; @in ...

  3. IOS GCD定时器

    提到定时器,NStimer肯定是我们最为熟悉的. 但是NStimer有着很大的缺点,并不准确. 通俗点说,就是它该做他的事了,但是由于其他事件的影响,Nstimer会放弃他应该做的. 而GCD定时器, ...

  4. runloop 和 CFRunLoop - 定时器 - NSTimer 和 GCD定时器

    1. 2. #import "ViewController.h" @interface ViewController () @property (nonatomic, strong ...

  5. 关于普通定时器与高级定时器的 PWM输出的初始化的区别

    不管是普通定时器还是高级定时器,你用哪个通道,就在程序里用OC多少.比如CH3对应OC3 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;  TIM_ ...

  6. [ZigBee] 6、ZigBee基础实验——定时器3和定时器4(8 位定时器)

    上一节讲了16位定时器1,本节讲8位定时器3和定时器4! 1.综述 Timer 3 and Timer 4 are two 8-bit timers(8位定时器). Each timer has tw ...

  7. 14.TCP的坚持定时器和保活定时器

    一.坚持定时器   1.坚持定时器的由来         TCP通过让接收方指明希望从发送方接受的窗口大小来进行流量控制.设置窗口大小为0可以组织发送方传送数据,直至窗口变为非0为止.         ...

  8. TCP的定时器系列 — 保活定时器

    主要内容:保活定时器的实现,TCP_USER_TIMEOUT选项的实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 原理 HTTP有Keepaliv ...

  9. TCP的定时器系列 — SYNACK定时器

    主要内容:SYNACK定时器的实现,TCP_DEFER_ACCPET选项的实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 在上一篇博客中,已经连带 ...

随机推荐

  1. 微信公众号平台接口开发:基础支持,获取微信服务器IP地址

    官方说明 目前看不出来这个接口有哪些具体运用,但是既然有这个接口,那我们就试试能不能用 访问接口 修改WeCharBase.cs,新增以下2个方法 public static string Serve ...

  2. C# 获取文件MD5与SHA1

    之前刚开始学习编程的时候,总想着自己写一些小软件小工具. 而这个就是经典的文件MD5校验,顺便加上了一个SHA1. 在网络上下载一些东西时,会有作者提供MD5值. 它的作用就在于我们可以在下载该软件后 ...

  3. Extjs mvc

    MVC的模式,模型(Models)和控制器(Controllers) Model模型 是字段和它们的数据的集合,例如User模型带有username和password字段,模型知道如何持久化自己的数据 ...

  4. Python,datetime模块实例

    Python的标准模块datetime模块,在我们的工作中应用非常频繁,下面对datetime中常用的方法进行了总结和测试:对每一个方法都使用了单元测试框架Unittest来配合测试. 主要的类型有: ...

  5. protocol error, got 'n' as reply type byte

    centos6.5上安装redis3.2版本,本地访问redis报错protocol error, got 'n' as reply type byte 解决办法 在redis配置文件redis.co ...

  6. 学习笔记——Java核心技术之接口、继承与多态练习题

    1.创建一个抽象类,验证它是否可以实例化对象. package com.lzw; public abstract class UseCase3 { abstract void doit(); publ ...

  7. WebApi接口传参不再困惑:传参详解

    原文出处: 懒得安分 前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料.如今,使用WebApi也有段时间了,今天就记录下API接口传参的一些方式方法,算是一个笔记,也希望 ...

  8. 成为一名合格的ERP实施顾问应该具备哪些修为

    要想成为一个合格ERP实施顾问,究竟需要点什么素质.请注意,这里的素质与技能是两码事,素质特别强调的是某种修养,技能可以速成,修养必须积累沉淀. 快速切入客户业务的能力 作为一个合格的ERP实施人员, ...

  9. Visual Studio 2017正式版使用一些疑问

    刚升级完2017,是从2015升上去的,总体没有什么大的问题,就是报了一些ts的类型检查的问题,最重要的就是编译速度变得好慢啊,希望尽快出来补丁修复,以前一个解决方案只要10+秒,现在要50秒,表示体 ...

  10. Java数据结构之Map学习总结

    前言: 前面学习总结了List的使用及效率对比,今天总结学习一下键值映射关系Map,顺便学习一下Android中使用Map需要注意哪些,以及谷歌官方针对Android对Map做了哪些优化. 先了解下M ...