标签:
1.GCD的应用 单例模式 这是我最开始接触的GCD应用
-(void)gcdTest1
{
static dispatch_once_t onceToken;
dispatch_once(&onceToken,^{
NSLog(@"%@",[NSThread currentThread]);
});
}
2.延迟操作
在需要进行延迟的操作设置时可以使用GCD方式 ,但是使用的比较少,因为写起来比较麻烦 所以了解一下即可 ,第一种使用方法比较多。
-(void)gcdTest2
{
//1. 延迟操作方法1
// [self performSelector:@selector(doAction) withObject:nil afterDelay:2];
//2. 延迟操作方法2
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW,(int64_t)(2 * NSEC_PER_SEC));
//此处的写成主队列 dispatch_get_main_queue()
// when dispatch_time_t
dispatch_after(time, dispatch_get_main_queue(), ^{
//打印当前的线程
NSLog(@"%@",[NSThread currentThread]);
});
}
-(void)gcdTest3
{
// 创建调度组 **** 实现多线程 异步
dispatch_group_t group = dispatch_group_create();
//创建全局队列(并发)
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//调度组进行异步请求 (异步进行 所以执行顺序不固定)
dispatch_group_async(group, queue, ^{
//设置时延
[NSThread sleepForTimeInterval:2];
NSLog(@"下载第一张图片");
});
dispatch_group_async(group, queue, ^{
//设置时延
[NSThread sleepForTimeInterval:2];
NSLog(@"下载第二张图片");
});
dispatch_group_async(group, queue, ^{
//设置时延
[NSThread sleepForTimeInterval:2];
NSLog(@"下载第三张图片");
});
dispatch_group_async(group, queue, ^{
//设置时延
[NSThread sleepForTimeInterval:2];
NSLog(@"下载第四张图片");
});
//当所有异步请求完成时 调用dispatch_group_nofity
dispatch_group_notify(group, queue, ^{
NSLog(@"下载完成,更新UI");
NSLog(@"%@",[NSThread currentThread]);
});
}
4.创建调度组的方式二 (对比上述方法看)
1.等待调度队列wait相当于一个阻塞状态
2.DISPATCH_TIME_FOREVER 时间是永远
3.wait一直等待上面完成之后再执行
-(void)gcdTest4
{
dispatch_group_t group = dispatch_group_create();
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//进入队列
dispatch_group_enter(group);
dispatch_async(queue, ^{
NSLog(@"下载第一张图");
//离开队列
dispatch_group_leave(group);
});
dispatch_group_enter(group);
dispatch_async(queue, ^{
NSLog(@"下载第二张图");
dispatch_group_leave(group);
});
dispatch_group_enter(group);
dispatch_async(queue, ^{
NSLog(@"下载第三张图");
dispatch_group_leave(group);
});
dispatch_group_enter(group);
dispatch_async(queue, ^{
NSLog(@"下载第四张图");
dispatch_group_leave(group);
});
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
NSLog(@"更新UI");
}
5.中断操作
注意这里使用 dispatch_barrier_async 的时候 必须使用自定义的并发队列 使用全局队列不好使
-(void)gcdTest5
{
//创建一个并发队列
dispatch_queue_t queue = dispatch_queue_create("Chen-iOS", DISPATCH_QUEUE_CONCURRENT);
//异步
dispatch_async(queue, ^{
//设置时间延迟
[NSThread sleepForTimeInterval:2];
NSLog(@"1");
});
dispatch_async(queue, ^{
//设置时间延迟
[NSThread sleepForTimeInterval:1];
NSLog(@"2");
});
dispatch_async(queue, ^{
//设置时间延迟
[NSThread sleepForTimeInterval:3];
NSLog(@"3");
});
//添加中断操作
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//
dispatch_barrier_async(queue, ^{
NSLog(@"-=-=-=-=-=-=-=-=-=-=-=-=-=-=");
[NSThread currentThread];
});
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-//
dispatch_async(queue, ^{
//设置时间延迟
[NSThread sleepForTimeInterval:5];
NSLog(@"4");
});
dispatch_async(queue, ^{
//设置时间延迟
[NSThread sleepForTimeInterval:4];
NSLog(@"5");
});
}
6.遍历操作
-(void)gcdTest6
{
//创建一个全局的队列
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
//iterations 遍历的次数
dispatch_apply(5, queue, ^(size_t i) {
NSLog(@"%@",@(i));
});
}
标签:
原文地址:http://www.cnblogs.com/VzhanggengD/p/5499339.html