GCD的作用 :
可以执行复杂操作来响应用户的输入, 同时保持迅速响应, 使用户不会在处理器执行某些后台任务时长时间等待.
注意 :
在 Cocoa Touch中, Foundation 框架 (包含适用于所有 OC编程类型的基本类, 比如 NSString, NSArray等) 通常被视为线程安全. UIKit框架 (包含专门用于构建 GUI应用程序的类, 比如 UIApplication, UIView及其所有子类) 在很大程度上被视为不安全的. 因此 : 正在运行的 iOS 应用程序中, 处理任何UIKit 对象的所有方法调用都应在主线程内执行.
低级队列
__block int a = 0; dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
dispatch_async(dispatch_get_main_queue(), ^{
a = 47;
});
});
dispatch_get_global_queue() 函数 :
抓取一个已经存在并始终可用的全局队列. 包含两个参数, 第一个用于指定优先级, 默认为DISPATCH_QUEUE_PRIORITY_DEFAULT 对应0; 第二个未使用应该始终为0.
该函数将实际获取一个不同的全局队列, 系统将对该队列分配不同的优先级, 然后将该队列以及它后面的代码块一起传递给dispatch_async() 函数, GCD然后获取整个程序块, 并将它传递给一个后台线程, 该程序块将在后台线程一步一步执行.
dispatch_get_main_queue() 函数 :
该函数提供存在于主线程上的特殊队列, 并准备执行需要使用主线程的程序块.
__block 修饰符, 进行程序块外部变量的读和写.
并发程序块
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self method1];
});
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self method2];
});
dispatch_group_notify(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
[self method3];
});
dispatch_group_async() 函数异步分派所有程序块设置为松散的, 以尽可能快地执行, 如果可能, 将它们分发给多个线程来同时执行.
dispatch_group_notify() 函数指定一个额外的程序块, 该程序块将在组中的所有程序块运行完成时执行.
此时, 代码中method1和method2并发执行, 节省运行时间提交效率, 执行后的结果带入method3中最后执行.
总结 :
GCD不是万能的. 使用 GCD并不会自动加速每个应用程序, 但通过在应用程序中的速度至关重要的地方或对用户的响应迟缓位置谨慎地应用 GCD, 即使无法改进真实性能, 至少能够提供更出色的用户体验.