您的位置:首页 > 其它

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(@"我是最后执行的.....");

});
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  GCD用法