GCD的介绍与使用(四)

来源:互联网 发布:olay多效修护霜 知乎 编辑:程序博客网 时间:2024/05/01 10:09

GCD的介绍与使用(四)

1、 Main Dispatch Queue

   是在主线程中执行任务的Dispatch Queue。因为主线程只有1个,所以Main Dispatch Queue是Serial Dispatch Queue。   追加到Main Dispatch Queue中的任务将在主线程的RunLoop中执行。    因为是在主线程中执行,所以应该只将用户界面更新等一些必须在主线程中执行的任务追加到Main Dispatch Queue中。 
dispatch_queue_t dispatch_main_queue = dispatch_get_main_queue();

2、 dispatch_group_async的使用

 dispatch_group_async可以实现监听一组任务是否完成,完成后得到通知执行其他的操作。  这个方法很有用,比如你执行三个下载任务,当三个任务都下载完成后你才通知界面说完成的了。 
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);      dispatch_group_t group = dispatch_group_create();      dispatch_group_async(group, queue, ^{          [NSThread sleepForTimeInterval:6];          NSLog(@"group1 [NSThread sleepForTimeInterval:6];");      });      dispatch_group_async(group, queue, ^{          [NSThread sleepForTimeInterval:3];          NSLog(@"group2 [NSThread sleepForTimeInterval:3];");      });      dispatch_group_async(group, queue, ^{          [NSThread sleepForTimeInterval:1];          NSLog(@"group3 [NSThread sleepForTimeInterval:1];");      });      dispatch_group_notify(group, dispatch_get_main_queue(), ^{          NSLog(@"main thread.");      });  
  这相当于把放在线程队列中的任务,归类成一个组,当这个组中的任务全部完成后,  才会调用使用dispatch_group_notify的线程任务。

3、dispatch_barrier_async的使用

 dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行  
    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)    dispatch_async(queue, ^{          [NSThread sleepForTimeInterval:3];          NSLog(@"dispatch_async1");      });      dispatch_async(queue, ^{          [NSThread sleepForTimeInterval:1];          NSLog(@"dispatch_async2");      });      dispatch_barrier_async(queue, ^{          NSLog(@"dispatch_barrier_async");          [NSThread sleepForTimeInterval:0.5];      });      dispatch_async(queue, ^{          [NSThread sleepForTimeInterval:1];          NSLog(@"dispatch_async3");      });  
这是一个global_queue,放入其中的任务是并发的,使用dispatch_barrier_async可以保证,在其之前的任务完成后执行,在其之后的任务等到其完成后执行。上面的代码 dispatch_barrier_async 会在dispatch_async1和dispatch_async2执行完后执行,dispatch_async3会在dispatch_barrier_async执行完后执行。
0 0
原创粉丝点击