[多线程]Grand Central Dispatch(GCD)实例

由于今天是最后一天,吃个早餐都难。
于是喝了个牛奶就赶到公司,结果通知今天最后一天,如果没特别的事情就可以现在回家了。

Grand Central Dispatch 简称(GCD)支持多核,高效率的多线程技术。
辅助资料:https://developer.apple.com/library/ios/documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.html

由于着急回家过年,暂时一次性发上来,有点乱….
把文字都加到代码注解里面去了,方便大家看,闪人咯!
举个栗子~~栗子:
[objc]
NSLog(@"Example GCD");
dispatch_queue_t queue = dispatch_queue_create("name", NULL);//创建一个新的队列。
//创建一个子线程
dispatch_async(queue, ^{
// 子线程code…
NSLog(@"GCD多线程");

//回到主线程
dispatch_sync(dispatch_get_main_queue(), ^{
//该部分也是在子线程中执行,只是把它放到了主线程的队列中
if ([NSThread isMainThread]) {
//判断当前线程是否主线程
//YES:当前线程为主线程,NO则不是。
NSLog(@"GCD主线程");
}
});
});
NSLog(@"Example End");
[/objc]
控制台:
[objc]
2014-01-28 09:54:57.931 test[21499:60b] Example GCD
2014-01-28 09:54:57.934 test[21499:60b] Example End
2014-01-28 09:54:57.934 test[21499:1903] GCD多线程
2014-01-28 09:54:57.961 test[21499:60b] GCD主线程
[/objc]

栗子2,关于dispatch_group_async:
dispatch_group_async是可以监听一组任务是否完成,
当这组任务完成后,会进行通知执行其他操作。
[objc]
//创建队列,并设置优先级运行;
dispatch_queue_t queue2 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_group_t group = dispatch_group_create();

//dispatch_group_async是可以监听一组任务是否完成,
//当这组任务完成后,会进行通知执行其他操作。
dispatch_group_async(group, queue2, ^{
[NSThread sleepForTimeInterval:1];
NSLog(@"group 1");
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"更新UI 1");
});
dispatch_group_async(group, queue2, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"group 2");
});
dispatch_group_async(group, queue2, ^{
[NSThread sleepForTimeInterval:3];
NSLog(@"group 3");
});
dispatch_group_notify(group, dispatch_get_main_queue(), ^{
NSLog(@"更新UI 2");
});
dispatch_release(group);
[/objc]
控制台:
[objc]
2014-01-28 09:57:29.328 test[21524:1903] group 1
2014-01-28 09:57:30.328 test[21524:3807] group 2
2014-01-28 09:57:31.329 test[21524:3907] group 3
2014-01-28 09:57:31.331 test[21524:60b] 更新UI 1 <—注意这里
2014-01-28 09:57:31.333 test[21524:60b] 更新UI 2
[/objc]

栗子3 关于dispatch_barrier_async :
dispatch_barrier_async 是先执行上一个任务,后执行。并且后面的任务需要等它执行完才执行。
[objc]
dispatch_queue_t queue3 = dispatch_queue_create("name", DISPATCH_QUEUE_CONCURRENT);//并发调度队列执行块。
dispatch_async(queue3, ^{
[NSThread sleepForTimeInterval:1];
NSLog(@"dispatch_async 1");
});
dispatch_async(queue3, ^{
[NSThread sleepForTimeInterval:2];
NSLog(@"dispatch_async 2");
});

//dispatch_barrier_async 是在执行 dispatch_async 2 后,
//再执行 [NSThread sleepForTimeInterval:5]; 休眠5秒,
//并且打印 dispatch_barrier_async 后,才会往下走
dispatch_barrier_async(queue3, ^{
[NSThread sleepForTimeInterval:5];
NSLog(@"dispatch_barrier_async");

});
dispatch_async(queue3, ^{
[NSThread sleepForTimeInterval:1];
NSLog(@"dispatch_async 3");
});
[/objc]
控制台:
[objc]
2014-01-28 10:00:25.351 test[21566:1903] dispatch_async 1 <—注意时间25
2014-01-28 10:00:26.352 test[21566:3807] dispatch_async 2 <—注意时间26
2014-01-28 10:00:31.355 test[21566:3807] dispatch_barrier_async <—注意时间31
2014-01-28 10:00:32.359 test[21566:3807] dispatch_async 3 <—注意时间32
[/objc]

栗子4:
[objc]
dispatch_queue_t global4 = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(3, global4, ^(size_t index) {
//连续执行3次
NSLog(@"hello");
});
[/objc]

80 thoughts on “[多线程]Grand Central Dispatch(GCD)实例

Xfxdyc进行回复 取消回复

电子邮件地址不会被公开。