GCD的简单使用<二>
2016-08-16 00:00
344 查看
1、多次执行的任务
dispatch_apply()函数将控制提交的代码块重复执行多次,提交给并发队列,系统可以使用多个线程并发的执行同一个代码块。
程序启动了多个线程执行该代码块。
2、只执行一次的任务
dispatch_once()函数在整个应用的生命周期内最多只执行一次,只有第一次提交该代码块时,才会获得执行机会。dispatch_once()不需要传入队列,系统会直接在主线程执行该函数提交的代码块。
dispatch_once()函数需要传入一个dispatch_once_t类型的指针,用来判断该代码块是否已经执行过。
在程序中创建一个按钮,并绑定点击事件
只有第一次点击的时候会输出,然后再点击的话就不会有输出语句。当然如果重新运行程序的话,第一次点击还是会输出。
利用dispatch_once()函数创建单例
假设有个People,创建单例代码
这样可以保证线程的安全,不会因为多个线程同时调用sharedInstance方法而创建多个对象。
这种情况下调用alloc方法会发生什么呢?
由结果看出这两个对象的内存地址是不一样的,这显然不符合单例的要求,解决这个问题,必须要重写People的alloc方法。
这样两种初始化方法得到的就是同一个对象,当然defaultPeople类似的初始化方法需要的话也可以自己去重写。
dispatch_apply()函数将控制提交的代码块重复执行多次,提交给并发队列,系统可以使用多个线程并发的执行同一个代码块。
dispatch_apply(5, dispatch_get_global_queue(0, 0), ^(size_t time) { NSLog(@" ----- %lu --- %@",time,[NSThread currentThread]); });
程序启动了多个线程执行该代码块。
2、只执行一次的任务
dispatch_once()函数在整个应用的生命周期内最多只执行一次,只有第一次提交该代码块时,才会获得执行机会。dispatch_once()不需要传入队列,系统会直接在主线程执行该函数提交的代码块。
dispatch_once()函数需要传入一个dispatch_once_t类型的指针,用来判断该代码块是否已经执行过。
在程序中创建一个按钮,并绑定点击事件
- (IBAction)buttonClick:(id)sender { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSLog(@"是执行一次吗 ?"); }); }
只有第一次点击的时候会输出,然后再点击的话就不会有输出语句。当然如果重新运行程序的话,第一次点击还是会输出。
利用dispatch_once()函数创建单例
假设有个People,创建单例代码
+ (People *)sharedInstance { static People *sharedPeopleInstance = nil; static dispatch_once_t predicate; dispatch_once(&predicate, ^{ sharedPeopleInstance = [[self alloc] init]; }); return sharedPeopleInstance; }
这样可以保证线程的安全,不会因为多个线程同时调用sharedInstance方法而创建多个对象。
这种情况下调用alloc方法会发生什么呢?
People *peo1 = [People sharedInstance]; People *peo2 = [[People alloc]init]; NSLog(@" %p---- %p",peo1,peo2);
由结果看出这两个对象的内存地址是不一样的,这显然不符合单例的要求,解决这个问题,必须要重写People的alloc方法。
// 重写alloc 方法封堵创建方法(调用alloc方法时 默认会调用allocWithZone这个方法) + (id)allocWithZone:(struct _NSZone *)zone{ if (sharedPeopleInstance == nil) { sharedPeopleInstance = [super allocWithZone:zone]; return sharedPeopleInstance; } return sharedPeopleInstance; }
这样两种初始化方法得到的就是同一个对象,当然defaultPeople类似的初始化方法需要的话也可以自己去重写。
相关文章推荐
- 图片加载框架简单介绍<二> Picasso 的基本使用
- MonkeyRunner的使用<二>
- <copy>Log4j日志管理系统简单使用说明
- android-intent(意图)使用-<二>
- 获取Windows Shell的简单示例程序<二>
- UE4.5.0的Kinect插件(Plugin)---插件使用说明<二>
- 最简单的struts2中使用<s:iterator>实现隔行变色代码[珍藏版]
- <Android>在Activity被非正常杀死并重建时,使用savedInstanceState进行数据恢复的简单实例
- primeFaces中 <p:dataList>简单使用
- VS2010开发工具使用技巧<之简单讲解>
- UICollectionView学习<1>之UICollectionView的简单使用
- MonkeyRunner的使用<二>
- IntelliJ IDEA使用技巧<二>
- Android 数据库ORM框架GreenDao学习心得及使用总结<二>
- 短信猫软件的实现(C#)<二> AT指令调试器的简单实现
- Solr 数据导入 <一>DIH简单使用
- 转载只为记录经典之<va_start va_arg va_end 的使用和原理二>
- 【LaTeX排版】LaTeX使用--入门基础<二>
- Android中<meta-data>的使用简单记录
- 关于delegate的简单使用说明<转载两篇>