/** dispatch_async 函数会将传入的block块放入指定的queue里运行。这个函数是异步的,这就意味着它会立即返回而不管block是否运行结束。因此,我们可以在block里运行各种耗时的操作(如网络请求) 而同时不会阻塞UI线程。 **/
/** dispatch_get_global_queue 会获取一个全局队列,我们姑且理解为系统为我们开启的一些全局线程。我们用priority指定队列的优先级,而flag作为保留字段备用(一般为0)。 **/
/** dispatch_get_main_queue 会返回主队列,也就是UI队列。它一般用于在其它队列中异步完成了一些工作后,需要在UI队列中更新界面。 **/
具体代码如下:
NSLog(@"1");
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),^{
//这里操作耗时的任务 不管block是否运行结束,都不会阻塞UI线程
// dispatch_async会向dispatch_get_global_queue全局队列去添加新的任务
//网络请求
//加载网络图片
//数据解析
NSLog(@"2");
dispatch_async(dispatch_get_main_queue(), ^(){
NSLog(@"4");
});
});
NSLog(@"3");
打印数据:
2017-11-07 09:32:24.030493+0800 project[1479:30512] 1
2017-11-07 09:32:24.030611+0800 project[1479:30512] 3
2017-11-07 09:32:24.030622+0800 project[1479:30718] 2
2017-11-07 09:32:24.033764+0800 project[1479:30512] 4
二 任务组
应用场景:在开发中,遇到N个网络请求都完成后更新UI的需求,这时使用dispatch_group_async
/** 有时候,我们希望多个任务同时(在多个线程里)执行,再他们都完成之后,再执行其他的任务, **/
/** 于是可以建立一个分组,让多个任务形成一个组,下面的代码在组中多个任务都执行完毕之后再执行后续的任务: **/
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
/** 创建一个group组 **/
dispatch_group_t group = dispatch_group_create();
/** 将block任务添加到queue队列,并被group组管理 **/
dispatch_group_async(group, queue, ^{
NSLog(@"request1");
});
dispatch_group_async(group, queue, ^{
NSLog(@"request2");
});
dispatch_group_notify(group,dispatch_get_main_queue(),^{
NSLog("updateUI");
})
添加进队列的任务延迟执行,该函数并不是在指定时间后执行处理,而只是在指定时间追加到自己需要的队列中去执行
//参数1 DISPATCH_TIME_NOW 表示 现在 NSEC_PER_SEC 秒 NSEC_PER_MSEC 毫秒 即是多长时间加入队列去执行block
//参数2 (int64_t)(2 * NSEC_PER_SEC) 表示的是多长时间去执行
//参数3 dispatch_get_main_queue() 想要加入哪个队列去执行 可以自定义
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//2秒后加入队列去执行这里面的东西
});