GCD常用用法
2016-07-18 14:17
246 查看
/**
*
2)并行队列global dispatch queue,通过dispatch_get_global_queue获取,由系统创建三个不同优先级的dispatch queue。并行队列的执行顺序与其加入队列的顺序相同。
3)串行队列serial queues一般用于按顺序同步访问,可创建任意数量的串行队列,各个串行队列之间是并发的。
当想要任务按照某一个特定的顺序执行时,串行队列是很有用的。串行队列在同一个时间只执行一个任务。我们可以使用串行队列代替锁去保护共享的数据。和锁不同,一个串行队列可以保证任务在一个可预知的顺序下执行。
*/
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
// [self backThread];
// [self mainThead];
//
// [self singleObj];
// [self singleObj];
// [self afterTime];
// [self mainThead];
// [self asyncGroup];
[selfasyncGroupMain];
}
// 后台执行 ---另开了一条线程处理
- (void)backThread{
dispatch_async(dispatch_get_global_queue(0,0), ^{
for (int i =0; i<20; i++) {
NSLog(@"backThread is name --- >%@",[NSThreadcurrentThread].description);
}
});
}
// 主线程执行--------在需要回到主线程的地方直接调用此方法。
- (void)mainThead{
dispatch_async(dispatch_get_main_queue(), ^{
for (int i =0; i<20; i++) {
NSLog(@"mainThead is name --- > %@", [NSThreadcurrentThread].description);
}
});
}
// 这个代码只会执行一次,常用于单利模式。
- (void)singleObj{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"这里面的代码只会执行一次");
});
}
// 延迟时间执行----调用这个方法并不会延迟主线程。其他的主线程的方法还是照样执行, 只是,后面的几秒钟后
// 这个主线程的方法在回来执行,相当于一个回调。 并不会阻止其他的方法调用。
- (void)afterTime{
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW,4.0*NSEC_PER_SEC);
dispatch_after(time,dispatch_get_main_queue(), ^{
NSLog(@"等了4秒了,开始执行了......");
NSLog(@"mainThead is name --- > %@", [NSThreadcurrentThread].description);
});
}
// 并行线程组, 如果需要和主线程交互的话, 直接交互就好。
- (void)asyncGroup{
dispatch_group_t group =dispatch_group_create();
dispatch_group_async(group,dispatch_get_global_queue(0,0), ^{
for (int i =0; i<200; i++) {
NSLog(@"我是线程一号");
}
});
dispatch_group_async(group,dispatch_get_global_queue(0,0), ^{
for (int i =0; i<200; i++) {
NSLog(@"我是线程二号");
}
});
dispatch_group_notify(group,dispatch_get_global_queue(0,0), ^{
NSLog(@"等待异步线程全部执行完后,我这里的总结----这里还是异步线程中,不在主线程");
NSLog(@"thread is -->%@",[NSThreadcurrentThread].description);
// 和主线程通信
dispatch_async(dispatch_get_main_queue(), ^{
self.view.backgroundColor = [UIColororangeColor];
NSLog(@"thread is -->%@",[NSThreadcurrentThread].description);
});
});
}
// 主线程处理。-----------异步和同步的处理的关键就是在于 dispatch_get_main_queue和 dispatch_get_global_queue
// 的区别。 这里是主线程的第一个任务处理完了,那么后面的在执行。 这种方式也可以处理不会让公共
// 资源的混乱的处理。
- (void)asyncGroupMain{
// 自定义 串行队列
dispatch_queue_t serialqueue = dispatch_queue_create("serial", DISPATCH_QUEUE_SERIAL);
// 自定义 并行队列
dispatch_queue_t concurrentqueue = dispatch_queue_create("concurrent", DISPATCH_QUEUE_CONCURRENT);
// 自定义队列,在这里也就决定了, 你是用异步处理还是同步处理问题。
dispatch_group_t group =dispatch_group_create();
dispatch_group_async(group,dispatch_get_main_queue(), ^{
for (int i =0 ; i<20; i++) {
NSLog(@"1号在执行");
}
});
dispatch_group_async(group,dispatch_get_main_queue(), ^{
for (int i =0; i < 20; i++) {
NSLog(@"2号在执行");
}
});
dispatch_group_notify(group,dispatch_get_main_queue(), ^{
NSLog(@"我是最后执行的.....");
});
}
*
2)并行队列global dispatch queue,通过dispatch_get_global_queue获取,由系统创建三个不同优先级的dispatch queue。并行队列的执行顺序与其加入队列的顺序相同。
3)串行队列serial queues一般用于按顺序同步访问,可创建任意数量的串行队列,各个串行队列之间是并发的。
当想要任务按照某一个特定的顺序执行时,串行队列是很有用的。串行队列在同一个时间只执行一个任务。我们可以使用串行队列代替锁去保护共享的数据。和锁不同,一个串行队列可以保证任务在一个可预知的顺序下执行。
*/
@implementation ViewController
- (void)viewDidLoad {
[superviewDidLoad];
// [self backThread];
// [self mainThead];
//
// [self singleObj];
// [self singleObj];
// [self afterTime];
// [self mainThead];
// [self asyncGroup];
[selfasyncGroupMain];
}
// 后台执行 ---另开了一条线程处理
- (void)backThread{
dispatch_async(dispatch_get_global_queue(0,0), ^{
for (int i =0; i<20; i++) {
NSLog(@"backThread is name --- >%@",[NSThreadcurrentThread].description);
}
});
}
// 主线程执行--------在需要回到主线程的地方直接调用此方法。
- (void)mainThead{
dispatch_async(dispatch_get_main_queue(), ^{
for (int i =0; i<20; i++) {
NSLog(@"mainThead is name --- > %@", [NSThreadcurrentThread].description);
}
});
}
// 这个代码只会执行一次,常用于单利模式。
- (void)singleObj{
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
NSLog(@"这里面的代码只会执行一次");
});
}
// 延迟时间执行----调用这个方法并不会延迟主线程。其他的主线程的方法还是照样执行, 只是,后面的几秒钟后
// 这个主线程的方法在回来执行,相当于一个回调。 并不会阻止其他的方法调用。
- (void)afterTime{
dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW,4.0*NSEC_PER_SEC);
dispatch_after(time,dispatch_get_main_queue(), ^{
NSLog(@"等了4秒了,开始执行了......");
NSLog(@"mainThead is name --- > %@", [NSThreadcurrentThread].description);
});
}
// 并行线程组, 如果需要和主线程交互的话, 直接交互就好。
- (void)asyncGroup{
dispatch_group_t group =dispatch_group_create();
dispatch_group_async(group,dispatch_get_global_queue(0,0), ^{
for (int i =0; i<200; i++) {
NSLog(@"我是线程一号");
}
});
dispatch_group_async(group,dispatch_get_global_queue(0,0), ^{
for (int i =0; i<200; i++) {
NSLog(@"我是线程二号");
}
});
dispatch_group_notify(group,dispatch_get_global_queue(0,0), ^{
NSLog(@"等待异步线程全部执行完后,我这里的总结----这里还是异步线程中,不在主线程");
NSLog(@"thread is -->%@",[NSThreadcurrentThread].description);
// 和主线程通信
dispatch_async(dispatch_get_main_queue(), ^{
self.view.backgroundColor = [UIColororangeColor];
NSLog(@"thread is -->%@",[NSThreadcurrentThread].description);
});
});
}
// 主线程处理。-----------异步和同步的处理的关键就是在于 dispatch_get_main_queue和 dispatch_get_global_queue
// 的区别。 这里是主线程的第一个任务处理完了,那么后面的在执行。 这种方式也可以处理不会让公共
// 资源的混乱的处理。
- (void)asyncGroupMain{
// 自定义 串行队列
dispatch_queue_t serialqueue = dispatch_queue_create("serial", DISPATCH_QUEUE_SERIAL);
// 自定义 并行队列
dispatch_queue_t concurrentqueue = dispatch_queue_create("concurrent", DISPATCH_QUEUE_CONCURRENT);
// 自定义队列,在这里也就决定了, 你是用异步处理还是同步处理问题。
dispatch_group_t group =dispatch_group_create();
dispatch_group_async(group,dispatch_get_main_queue(), ^{
for (int i =0 ; i<20; i++) {
NSLog(@"1号在执行");
}
});
dispatch_group_async(group,dispatch_get_main_queue(), ^{
for (int i =0; i < 20; i++) {
NSLog(@"2号在执行");
}
});
dispatch_group_notify(group,dispatch_get_main_queue(), ^{
NSLog(@"我是最后执行的.....");
});
}
相关文章推荐
- 资源Resource之values
- Android WebView开发问题及优化汇总
- DWR框架简单实例 (http://my.oschina.net/u/1790925/blog/366346)
- 应用、原生应用和混合应用的区别
- APP检查应用授予的权限
- IEDA 远程调试
- Windows服务程序开发介绍
- FDMB的认识
- pta 5-25
- Android使用VideoView选择文件播放(竖屏)
- zookeeper遇见错误总结
- DrawerLayout基本使用
- Markdown语法-简体中文
- Python方法之zip
- 让linux中的程序崩溃时生成core文件
- 理解观察者模式
- https
- iOS开发使用自定义字体
- 计蒜客 挑战难题 跳跃游戏二
- MySQL数据库存储引擎的概念与用途