Swift中的GCD——常见的dispatch方法
什么是GCD
Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法。该方法在Mac OS X 10.6雪豹中首次推出,并随后被引入到了iOS4.0中。GCD是一个替代诸如NSThread, NSOperationQueue, NSInvocationOperation等技术的很高效和强大的技术,它看起来象就其它语言的闭包(Closure)一样(在Swift确实成为了闭包),但苹果把它叫做blocks。
我们一般使用如下的dispatch方法:
解释:
第一句是异步执行,第二句是延迟异步执行,第三句是先后台运行,再更新UI
dispatch_get_main_queue 代表应用主线程执行,可以在内部更新UI(并不会阻塞主线程)
dispatch_get_global_queue 代表在系统后台运行,不一定和UI在同一线程,不能更新UI,适用于网络处理与Core Data等的处理。
修改block之外的变量
访问变量
默认情况下,在程序块中访问的外部变量是赋值(assign)过去的,即写操作不对原变量生效。但是你可以加上 __block来让其写操作生效,示例代码如下:
__block int a = 0;
void (^foo)(void) = ^{
a = 1;
}
foo();
// 这里,a的值被修改为1
访问对象
如果是在代码块内部访问self等对象,建议用弱指针引用后再在代码块(闭包)中使用
OC 中
__weak __typeof(&*self) ws = self;
Swift中,在闭包内声明
[unowned self]
另外
GCD还有一些高级用法,例如让后台2个线程并行执行,然后等2个线程都结束后,再汇总执行结果。这个可以用dispatch_group, dispatch_group_async 和 dispatch_group_notify来实现,示例如下:
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 并行执行的线程一
});
dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{
// 并行执行的线程二
});
dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{
// 汇总结果
});
Ref: