对于一些功能,必须得把下载过程放到后台线程进行处理,否则会阻塞UI线程显示。
系统提供的dispatch 方法。为了方便使用GCD,苹果提供了一些方法方便我们将block放在主线程或者后台线程执行.或者延后执行,使用的例子如下所示
// 后台执行
dispatch_async(dispatch_get_global_queue(0, 0), ^{
// something
});
// 主线程执行
dispatch_async(dispatch_get_main_queue(), ^{
// something
});
// 一次性执行
static dispatch_once_t onceToken;
dispatch_once(&onceToken,^{
// code to be executed once
});
// 延迟2秒执行
double delayInseconds = 2.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInseconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^{
// code to be executed on the main queue after delay
});
另外,GCD 还有一些高级用法,例如然后后天俩个线程并行运行,然后等两个线程都结束后,再汇总执行结果,这个可以用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), ^{
// 并行执行的线程1
});
dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
// 并行执行的线程2
});
dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
// 汇总结果
});
修改block 之外的变量
默认情况下,在程序块中访问的外部变量是复制过去的,即写操作不对原变量生效,但是你可以加上__block 来让其写操作生效,
__block int a = 0;
void (^foo)(void) = ^{
a = 1;
}
foo ();
// 这里,a 的值被修改为1
后台运行
使用block 的另一个用处是可以让程序在后台长久的运行,在以前,当应用被按Home,键退出后,应用仅有最多5秒钟的时间做一些保存或清理资源的工作,但是应用可以调用UIApplication 的beginBackgoundTaskWithExpirtionHandler方法,让应用最多有10分钟的时间在后台长久运行,这个时间可以用来做清理本地缓存,发送统计数据等工作。
总结来说,GCD能够极大的方便开发者进行多线程编程,大家应该尽量使用GCD来处理后台线程,和UI线程的交互。