博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS 多线程 之 GCD(大中枢派发)(二)
阅读量:6401 次
发布时间:2019-06-23

本文共 2471 字,大约阅读时间需要 8 分钟。

本文接着上一篇讲。主要讲:dispatch_source。

dispatch_source主要用户监听事件,可以监听如下事件

DISPATCH_SOURCE_TYPE_DATA_ADDDISPATCH_SOURCE_TYPE_DATA_ORDISPATCH_SOURCE_TYPE_MACH_RECVDISPATCH_SOURCE_TYPE_MACH_SENDDISPATCH_SOURCE_TYPE_PROCDISPATCH_SOURCE_TYPE_READDISPATCH_SOURCE_TYPE_SIGNALDISPATCH_SOURCE_TYPE_TIMERDISPATCH_SOURCE_TYPE_VNODEDISPATCH_SOURCE_TYPE_WRITEDISPATCH_SOURCE_TYPE_MEMORYPRESSURE

比较常用的就是实现Timer与自定义事件(DISPATCH_SOURCE_TYPE_DATA_ADD、DISPATCH_SOURCE_TYPE_DATA_OR)。

一、实现timer

使用NSTimer会有循环引用的问题,使用dispatch_source就不会有问题,代码如下

__block NSInteger count = 0;    dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());    dispatch_source_set_timer(timer, DISPATCH_TIME_NOW, 2.f * NSEC_PER_SEC, 0 * 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 = 0;    dispatch_source_t source = dispatch_source_create(DISPATCH_SOURCE_TYPE_DATA_ADD, 0, 0, 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, 0);        dispatch_semaphore_t semaphore = dispatch_semaphore_create(10);            for (int i = 0; i < 100; i++) {        dispatch_async(global, ^{            dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);                        dispatch_source_merge_data(source, 1);                        sleep(1.f);                        dispatch_semaphore_signal(semaphore);        });    }}- (void)dealloc{    dispatch_source_cancel(self.source);}
dispatch_source_cancel可以取消派发源,使派发员不在监听指定事件 你可以在这里下载

转载于:https://www.cnblogs.com/pretty-guy/p/8241178.html

你可能感兴趣的文章
Kerberos和NTLM - SQL Server
查看>>
记github上搭建独立域名的免费博客的方法过程
查看>>
Web设计之网页布局CSS技巧
查看>>
iOS key value coding kvc在接收json数据与 model封装中的使用
查看>>
Android 滑动效果入门篇(二)—— Gallery
查看>>
Revit二次开发示例:DesignOptions
查看>>
Entity Framework 系统约定配置
查看>>
优秀设计:纹理在网页设计中的20个应用示例
查看>>
C++ 关键字 explicit, export, mutable
查看>>
生成指定范围的一组随机数并求平均值
查看>>
android语音识别方法
查看>>
【c++】虚函数描写叙述符override
查看>>
File Operations in Android NDK(转)
查看>>
如何将kux格式的视频转换成我们常用的MP4格式
查看>>
[sublime系列文章] sublime text 3插件配置说明
查看>>
学习 PixiJS — 碰撞检测
查看>>
Vue 基础篇
查看>>
JavaScript:函数防抖与函数节流
查看>>
关于区间贪心的补全
查看>>
架构设计步骤
查看>>