IOS开发多线程GCD的学习(二)
来源:互联网 发布:淘宝不能用 编辑:程序博客网 时间:2024/05/01 19:20
1、dispatch_once的使用
(1)dispatch_once 多用来确保某段代码只执行一次,多用来进行单例的创建
+ (id)shareInstance
{
staticdispatch_once_t onceToken;
dispatch_once(&onceToken,^{
_shareInstance = [[self alloc] init];
});
return _shareInstance;
}
2、任务组dispatch_group_t
(1)使用场景:有时我们需要多个任务同时(在多个线程里)执行,在他们完成后再去执行其他的任务
(2)使用例子:thread1、thread2、thread3的执行顺序不确定,执行完1、2、3后方可执行done;
dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_group_t group =dispatch_group_create();
dispatch_group_async(group, queue, ^{
NSLog(@"thread1");
});
dispatch_group_async(group, queue, ^{
NSLog(@"thread2");
});
dispatch_group_async(group, queue, ^{
NSLog(@"thread3");
});
dispatch_group_notify(group,dispatch_get_main_queue() , ^{
NSLog(@"done");
});
typedefvoid (^complete)(void);
//自定义方法
- (void)delay:(double)delayTime toDo:(complete)complete
{
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (delayTime*NSEC_PER_SEC)), dispatch_get_main_queue(), complete);
}
//方法调用
[selfdelay:3 toDo:^{
UIAlertView *alert = [[UIAlertViewalloc]initWithTitle:@"alert"message:@"delay alert"delegate:self cancelButtonTitle:@"ok"otherButtonTitles: nil];
[alertshow];
}];
void dispatch_apply(size_t iterations, //执行的次数
dispatch_queue_t queue,//提交的队列
void (^block)(size_t));//执行的任务
(3)使用场景:把不相关的循环提交到后台线程并行执行,并且循环任务调度到后台执行的效率提高,能抵消掉队列调度本身的开销,那么效率 会显著提高
dispatch_queue_t queue =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_apply(20, queue, ^(size_t i) {
NSLog(@"%lu", i);
});
注意:这段代码让i并行循环了20次,如果内部处理的是一个数组,就可以实现对数组的并行循环了,它的内部是dispatch_sync的同 步操作,所以在执行这个循环的过程当中,当前线程会被阻塞。
5、dispatch_barrier_asyncvoid dispatch_barrier_async(dispatch_queue_t queue,dispatch_block_t block);
(3)使用场景:对于没有数据竞争的并行操作,则可以使用并行队列(CONCURRENT)来实现,例子:
dispatch_queue_t queue1 =dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);
dispatch_async(queue1, ^{
NSLog(@"1");
});
dispatch_async(queue1, ^{
NSLog(@"2");
});
dispatch_barrier_async(queue1, ^{
NSLog(@"3");
});
dispatch_async(queue1, ^{
NSLog(@"4");
});
dispatch_async(queue1, ^{
NSLog(@"5");
});
注意:这样1、2、3、4、5的执行顺序仍然不能确定,但是可以保证在执行3的时候无其他线程操作,直至3执行完毕- IOS开发多线程GCD的学习(二)
- iOS开发多线程GCD(二)
- ios开发多线程GCD的学习(一)
- iOS多线程的开发——GCD的使用与多线程开发浅析(二)
- iOS多线程开发——GCD的使用与多线程开发浅析(二)
- iOS多线程(二)GCD
- iOS开发多线程篇—GCD的常见用法(二)
- IOS开发 GCD多线程编程技术(二)
- iOS 多线程开发之OperationQueue(二)NSOperation VS GCD
- ios 开发学习 :多线程之GCD的使用指南
- iOS开发 多线程GCD
- iOS多线程开发 -------- GCD
- ios 多线程开发 GCD
- iOS多线程开发:GCD
- iOS开发,多线程GCD
- iOS GCD多线程开发
- iOS多线程GCD简介(二)
- iOS的多线程(GCD)
- Android访问网络 使用HttpURLConnection还是HttpClient?
- Spring MVC 4常用的那些注解 .
- html5 绘制椭圆
- J2EE:数据访问层的设计相关概念
- LeetCode—数组(1)
- IOS开发多线程GCD的学习(二)
- windows编程--网络编程学习--winsock编程(2)
- Android手机怎么获取打印机的IP地址呢
- Android中Java和JS双向调用
- js实现分享到人人网微信和qq等等
- 使用secureCRT连接Ubuntu服务器
- poj 1789 Truck History(Prim)(中等)
- Netty实现服务端客户端长连接通讯及心跳检测
- JStorm学习笔记