Object-C定时器,封装GCD定时器的必要性!!! (二)
上一篇: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定时器的必要性!!! (二)的更多相关文章
- Object-C定时器,封装GCD定时器的必要性!!! (一)
实际项目开发中经常会遇到延迟某件任务的执行,或者让某件任务周期性的执行.然后也会在某些时候需要取消掉之前延迟执行的任务. iOS中延迟操作有三种解决方案: 1.NSObject的方法:(对象方法) p ...
- GCD定时器
// // ViewController.m // GCD 定时器 // // #import "ViewController.h" NSInteger count = ; @in ...
- IOS GCD定时器
提到定时器,NStimer肯定是我们最为熟悉的. 但是NStimer有着很大的缺点,并不准确. 通俗点说,就是它该做他的事了,但是由于其他事件的影响,Nstimer会放弃他应该做的. 而GCD定时器, ...
- runloop 和 CFRunLoop - 定时器 - NSTimer 和 GCD定时器
1. 2. #import "ViewController.h" @interface ViewController () @property (nonatomic, strong ...
- 关于普通定时器与高级定时器的 PWM输出的初始化的区别
不管是普通定时器还是高级定时器,你用哪个通道,就在程序里用OC多少.比如CH3对应OC3 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_ ...
- [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 ...
- 14.TCP的坚持定时器和保活定时器
一.坚持定时器 1.坚持定时器的由来 TCP通过让接收方指明希望从发送方接受的窗口大小来进行流量控制.设置窗口大小为0可以组织发送方传送数据,直至窗口变为非0为止. ...
- TCP的定时器系列 — 保活定时器
主要内容:保活定时器的实现,TCP_USER_TIMEOUT选项的实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 原理 HTTP有Keepaliv ...
- TCP的定时器系列 — SYNACK定时器
主要内容:SYNACK定时器的实现,TCP_DEFER_ACCPET选项的实现. 内核版本:3.15.2 我的博客:http://blog.csdn.net/zhangskd 在上一篇博客中,已经连带 ...
随机推荐
- web前端面试题及答案
1.常用那几种浏览器测试?有哪些内核(Layout Engine)? 答: (Q1) 浏览器:IE,Chrome,FireFox,Safari,Opera. (Q2) 内核:Trident,Ge ...
- Win7配置IIS7
1.安装 控制面板\程序\程序和功能\打开或关闭Windows功能 选择Internet信息服务勾选相应的内容 2.打开iis信息服务管理器 点击菜单\运行(WIN+R) 输入iis 如图所示 可 ...
- OC中extern,static,const的用法
1.const的作用: const仅仅用来修饰右边的变量(基本数据变量p,指针变量*p). 例如 NSString *const SIAlertViewWillDismissNotification; ...
- 做一款直播类app
ijkplayer 是一款做视频直播的框架, 基于ffmpeg, 支持 Android 和 iOS, 网上也有很多集成说明, 但是个人觉得还是不够详细, 在这里详细的讲一下在 iOS 中如何集成ijk ...
- 从CMOS到触发器(二)
PS:可以转载,转载请标明出处:http://www.cnblogs.com/IClearner/ 前面说了CMOS器件,现在就接着来聊聊锁存器跟触发器吧,下面是这次博文要介绍的主要内容: ·双稳态器 ...
- css小技巧 :not 省时又省力
比如,要实现下面的效果(例如:一个列表的最后一项没有边框): See the Pen gmrGOV by 杨友存 (@Gavin-YYC) on CodePen. 一般的文档结构如下: <!-- ...
- 数据库:oracle,MySQL,SqlServer 安装资源分享
1. oracle 11g: 链接:http://pan.baidu.com/s/1bppaqR1 密码:http 2. mysql 链接:http://pan.baidu.com/s/1jH8O ...
- Android网络编程要学的东西与Http协议学习
本节引言: 本节开始我们来学习Android网络编程相关的一些东西:Android端网络编程是要干嘛?http协议的学习,使用自带扣脚Json解析类解析Json,XML解析常用的几种方式,HttpUr ...
- Solr vs. Elasticsearch谁是开源搜索引擎王者
当前是云计算和数据快速增长的时代,今天的应用程序正以PB级和ZB级的速度生产数据,但人们依然在不停的追求更高更快的性能需求.随着数据的堆积,如何快速有效的搜索这些数据,成为对后端服务的挑战.本文,我们 ...
- 新学期的第一节Android课
老师问,你们认为师生关系是什么样子的? 机智的我很快想到啦:或许是猫和老鼠的关系吧,嘿嘿O(∩_∩)O