iOS 多线程 之 GCD(大中枢派发)(二)
本文接着上一篇讲。主要讲:dispatch_source。
dispatch_source主要用户监听事件,可以监听如下事件
DISPATCH_SOURCE_TYPE_DATA_ADD
DISPATCH_SOURCE_TYPE_DATA_OR
DISPATCH_SOURCE_TYPE_MACH_RECV
DISPATCH_SOURCE_TYPE_MACH_SEND
DISPATCH_SOURCE_TYPE_PROC
DISPATCH_SOURCE_TYPE_READ
DISPATCH_SOURCE_TYPE_SIGNAL
DISPATCH_SOURCE_TYPE_TIMER
DISPATCH_SOURCE_TYPE_VNODE
DISPATCH_SOURCE_TYPE_WRITE
DISPATCH_SOURCE_TYPE_MEMORYPRESSURE
比较常用的就是实现Timer与自定义事件(DISPATCH_SOURCE_TYPE_DATA_ADD、DISPATCH_SOURCE_TYPE_DATA_OR)。
一、实现timer
使用NSTimer会有循环引用的问题,使用dispatch_source就不会有问题,代码如下
__block NSInteger count = ;
dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, , , dispatch_get_main_queue());
dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, .f * NSEC_PER_SEC, * NSEC_PER_SEC);
dispatch_source_set_event_handler(timer, ^{
NSLog(@"count == %li", count++);
});
dispatch_resume(timer);
需要注意的是dispatch_source_t不会创建之后自动执行,需要显示的调用dispatch_resume才会执行,而且调用resume之后会立刻执行一次。
二、监听用户自定义事件
DISPATCH_SOURCE_TYPE_DATA_ADD会对用dispatch_source_merge_data提交的数据进行累加,DISPATCH_SOURCE_TYPE_DATA_OR则是对提交的数据进行或运算。示例代码如下
@interface ViewController10 () @property (nonatomic, strong) dispatch_source_t source; @end @implementation ViewController10 - (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"dispatch_source_t 实现自定义事件");
//模拟器第一次执行会有卡顿,真机不会,俺也不知道原因
__block NSInteger total = ;
dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA_ADD, , , dispatch_queue_create("com.wk.serialQueue", DISPATCH_QUEUE_CONCURRENT));
dispatch_source_set_event_handler(source, ^{
NSInteger result = dispatch_source_get_data(source);
total += result;
NSLog(@"total = %li", total);
}); dispatch_source_set_cancel_handler(source, ^{
NSLog(@"取消了派发源");
}); dispatch_resume(source); self.source = source; dispatch_queue_t global = dispatch_get_global_queue(QOS_CLASS_UTILITY, ); dispatch_semaphore_t semaphore = dispatch_semaphore_create(); for (int i = ; i < ; i++) {
dispatch_async(global, ^{
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER); dispatch_source_merge_data(source, ); sleep(.f); dispatch_semaphore_signal(semaphore);
});
}
} - (void)dealloc
{
dispatch_source_cancel(self.source);
}
dispatch_source_cancel可以取消派发源,使派发员不在监听指定事件
你可以在这里下载demo
iOS 多线程 之 GCD(大中枢派发)(二)的更多相关文章
- GCD 大中枢派发 简单应用实例
@interface ViewController () { UIImageView* iv; UIButton* btn; UILabel* lbl; } @end @implementation ...
- [iOS]多线程和GCD
新博客wossoneri.com 进程和线程 进程 是指在系统中正在运行的一个应用程序. 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开QQ.Xcode,系统就会分别 ...
- iOS多线程 NSThread/GCD/NSOperationQueue
无论是GCD,NSOperationQueue或是NSThread, 都没有线程安全 在需要同步的时候需要使用NSLock或者它的子类进行加锁同步 "] UTF8String], DISPA ...
- iOS 多线程 之 GCD(大中枢派发)(一)
导语: 本文个人原创,转载请注明出处(http://www.cnblogs.com/pretty-guy/p/8126981.html) 在iOS开发中多线程操作通常是一下3种,本文着重介绍Dispa ...
- effective OC2.0 52阅读笔记(六 块与大中枢派发)
派发队列:dispatch_queue 操作队列:NSOperationQueue 组:dispathc_group_t 37 理解“块”这一概念 总结:块就是一个值,且自有其相关类型.块的强大之处 ...
- IOS多线程(GCD)
简介 Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其他的对称多处理系统的系统.这建立在任务并行执行的线程池模式的基础上的.它首次 ...
- ios 多线程小结----- GCD篇
//3 GCD(充分利用设备的多盒)-------------屏蔽了线程,只能看见任务 队列步骤两步,定制任务,将任务添加到队列.GCD将添加的任务,放到线程中去执行,自动执行,自动释放原则:先进先出 ...
- IOS 多线程 NSOperation GCD
1.NSInvocationOperation NSInvocationOperation * op; NSOperationQueue * que = [[NSOperationQueuealloc ...
- iOS 多线程之 GCD 的基本使用
什么是GCD 全称Grand Central Dispatch 中暑调度器 纯C语言 提供了很多强大的函数 GCD 的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU ...
随机推荐
- Django重新整理4---ModelForm-set(批量处理数据)
1. #引用modelformset from django.forms.models import modelformset_factory #必须继承forms.ModelForm! class ...
- TP扩展Xxtea.class.php加密解密函数用法
http://www.coolcode.org/?action=show&id=128这里可以查到一个相关文章. 附上xiunobbs里的代码,自己加了点注释,欢迎大牛批评指正 //将数值数组 ...
- Python第三方库使用感言
Python第三方库使用的感言加使用笔记 一般来讲第三方库会提供大量的类与对象, 对象方法的返回值和库中函数的返回值一般不会是Python原始自带的对象, 而是由该第三方库提供的对象, 因为Pytho ...
- centos6.3 配置防火墙,开启80端口、3306端口
vi /etc/sysconfig/iptables -A INPUT -m state –state NEW -m tcp -p tcp –dport 80 -j ACCEPT(允许80端口通过防火 ...
- (生产)axios - 请求接口
参考:https://www.awesomes.cn/repo/mzabriskie/axios axios 介绍 基于 Promise 的 HTTP 请求客户端,可同时在浏览器和 node.js 中 ...
- [转]QT 4.8 静态库编译方法
最最初踏上QT之路是受到了XiaomaGee的指点,相比于常规的窗口程序开发,QT有着以下特点: 1. 优良的跨平台特性(支持Win.Linux.Mac 不同的平台下只需重新编译即可使用) 2. 面向 ...
- CAD鼠标移动到对象时显示对象内容
//定义事件 Editor ed = doc.Editor; ed.PointMonitor += new PointMonitorEventHandler(ed_Po ...
- Android打包异常
Android在打包的时候,报错: 找不到类,或者打包之后运行找不到类,都可以在混淆文件中添加这个属性: -dontoptimize 通过测试,都可以解决. 来自为知笔记(Wiz)
- R.java文件无法自动生成的问题
如果出现R.java文件无法自动生成的问题,同时Console窗口提示下列信息: Android requires compiler compliance level 5.0 or 6.0. Foun ...
- TeamViewer安装使用
1.下载安装包 官网下载最新安装包 2.安装步骤 3.连接 输入密码即可控制伙伴电脑.