iOS开发-线程篇-GCD其他方法
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]);
});
}
3.创建调度组方式一 ( **** ) 这个是CGD重要的应用,必须掌握,在开发中经常用到!(实现并发异步操作,即多线程执行)
-(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));
});
}
转载于:https://www.cnblogs.com/Horkly/p/Horkly_GCD.html
- 点赞
- 收藏
- 分享
- 文章举报
- iOS 开发中,多线程编程GCD的常用方法总结
- iOS开发手记 - iOS9.3 Xcode7打包ipa文件在其他越狱机器上运行的方法和一些问题
- [IOS 开发] GCD常用方法
- iOS开发-GCD、NSThread、NSOperation的简单示例方法
- iOS开发 GCD一些常用的方法
- iOS开发之:iOS单个ViewController支持横屏,其他全竖屏方法
- iOS线程开发之--BLOCK & GCD(Grand Central Dispatch)
- 【iOS-Cocos2d游戏开发之十一】使用Box2d物理系统以及在cocos2d框架添加Box2d物理系统lib包的方法
- 【转】 iOS开发:Debug与Release版本NSLog屏蔽方法
- [IOS]iphone开发之UIImage应用与内存管理,UIImage加载图像方法
- IOS开发:关于UIPickerView类的代理方法titleForRow和viewForRow的使用问题
- ios开发中类方法以及self的注意点
- iOS程序开发引用的第三方库之间出现duplicate symbol时的处理方法
- IOS开发中,手工要求UITableView 根据新的内容重写画表单的方法
- IOS开发之Quart绘图方法简介
- iOS开发中生成随机数方法的选择
- 打开键盘遮住View的问题解决方法-IOS开发
- iOS开发那些事--编写OCUnit测试方法-逻辑测试方法
- iOS开发那些事--编写OCUnit测试方法-应用测试方法
- IOS]iphone开发之UIImage应用与内存管理,UIImage加载图像方法