GCD多线程的实现方法
GCD的多线程实现:
优点:便于使用
不同队列的优先级:
DISPATCH_QUEUE_PRIORITY_DEFAULT 第二优先级
DISPATCH_QUEUE_PRIORITY_HIGH 最高优先级
DISPATCH_QUEUE_PRIORITY_LOW 第三优先级
DISPATCH_QUEUE_PRIORITY_BACKGROUND 最低优先级
主队列:更新UI。
/创建子线程
[self senddate];//发送网络请求
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//调用主线程,在主线程中更新ui
dispatch_async(dispatch_get_main_queue(), ^{
[self updateUI];//更新UI
});
});
全局队列:
//创建gcd全局队列
dispatch_queue_t myqueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);//保留参数flag,一般传0
//通过异步方式运行队列任务
dispatch_async(myqueue, ^{
[self senddate];
});
自定义队列:
//创建gcd自定义队列
dispatch_queue_t myqueue1 = dispatch_queue_create(nil, DISPATCH_QUEUE_CONCURRENT);//第一个参数传一个队列标识符
dispatch_async(myqueue1, ^{
[self senddate];
});
GCD的延迟队列:
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * 2);//延时两秒
dispatch_after(time, dispatch_get_main_queue(), ^{
[self senddate];
});
GCD的重复队列:
//重复队列
//同步函数,会阻塞线程
dispatch_apply(3.0, dispatch_get_global_queue(0,0), ^(size_t index) {
NSLog(@"%zu",index);
});
GCD的组队列:
自定义一个组队列,在组队列中的所有队列都完成之后,在执行组队列notify中的任务,相当于对组队列中的队列进行了监听
//组队列
//创建组队列
dispatch_group_t mygroup = dispatch_group_create();
//组1
dispatch_group_async(mygroup, myqueue, ^{
[self senddate];
});
//组2
dispatch_group_async(mygroup, myqueue, ^{
[self updateUI];
});
//执行完上诉两个队列后,再打印加载完毕
dispatch_group_notify(mygroup, dispatch_get_main_queue(), ^{
NSLog(@"加载完毕");
});
组内等待队列
//直到关联组内的所有的任务完成后,再执行下面的操作。也可以用dispatch_time_t设置等待时间来完成操作
dispatch_group_wait(mygroup, DISPATCH_TIME_FOREVER);
暂停队列和恢复队列
//暂停队列
dispatch_suspend(myqueue);//无法暂停主队列和系统提供的队列,如果队列已经加载到主队列中,是无法暂停的。
//恢复队列
dispatch_resume(myqueue);
单例,保证线程安全,在整个线程中 只执行一次,我在单例模式那篇文章中已有详细说明
+(single *)share
{
static single *instance;
//保证方法体里面代码只能运行一次
dispatch_once_t once = 0;
dispatch_once(&once, ^{
if (instance == nil) {
instance = [[single alloc]init];
NSLog(@"%@",instance);
}
});
return instance;
}
并行队列的阻塞队列:
//等待dispatch_barrier_async队列前面的队列完成之后才会执行dispatch_barrier_async队列,然后再执行它下面的队列。dispatch_barrier_async队列最好是自定义的队列,应为它自身会阻塞线程,如果用主队列,对系统本身的队列并不好。
dispatch_barrier_async(myqueue, ^{
});