ios之dispatch_async

来源:互联网 发布:java 锁 互斥量 编辑:程序博客网 时间:2024/05/11 20:32

GCD的先进先出队列FIFO,称为dispatch queue;

dispatch queue 分为三种类型:

serial,又称 private dispatch queues,同时只执行一个任务。

concurrent ,又称为global dispatch queue,可以并发地执行多个任务,但执行完成的顺序是随机的。

main dispatch queue,是在应用程序主线程上执行任务。

1.dispatch_async 异步调度

dispatch_get_global_queue(0,0),//获取全局队列

dispatch_get_main_queue()//获取 main dispatch queue .

获取一个全局队列是接受两个参数,第一个是我分配的事物处理程序块队列优先级。分高低和默认,0为默认2为高,-2为低

[cpp] view plaincopy
  1. #define DISPATCH_QUEUE_PRIORITY_HIGH     2  
  2. #define DISPATCH_QUEUE_PRIORITY_DEFAULT  0  
  3. #define DISPATCH_QUEUE_PRIORITY_LOW     (-2)    
  4. dispatch_async(dispatch_get_global_queue(0,0) ,^{block主体});

2.dispatch_sync 同步调度

dispatch_sync(queue,task) 会阻塞当前线程,直到完成任务。

 dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", NULL); //获取serial queue .

 dispatch_queue_t queue = dispatch_queue_create("com.example.MyQueue", NULL); // 串行queue
    dispatch_set_context(queue, @"xxx");
    dispatch_set_finalizer_f(queue, &myFinalizerFunction);
    for (int i = 0; i<10; i++) {
        dispatch_async(queue, ^{
            NSLog(@"%d",i);
        });
    }
    NSLog(@"waiting");
    dispatch_sync(queue, ^{
        NSLog(@"wait done");
    });
    dispatch_release(queue);

2011-07-05 17:54:35.479 ttt[44203:207] waiting
2011-07-05 17:54:35.479 ttt[44203:1803] 0
2011-07-05 17:54:35.481 ttt[44203:1803] 1
2011-07-05 17:54:35.482 ttt[44203:1803] 2
2011-07-05 17:54:35.482 ttt[44203:1803] 3
2011-07-05 17:54:35.483 ttt[44203:1803] 4
2011-07-05 17:54:35.483 ttt[44203:1803] 5
2011-07-05 17:54:35.484 ttt[44203:1803] 6
2011-07-05 17:54:35.484 ttt[44203:1803] 7
2011-07-05 17:54:35.485 ttt[44203:1803] 8
2011-07-05 17:54:35.485 ttt[44203:1803] 9
2011-07-05 17:54:35.486 ttt[44203:207] wait done

2011-07-05 17:54:35.487 ttt[44203:1803] xxx

从以上代码可以看出dispatch_async 与 dispatch_sync的区别。

2.dispatch_group_async的使用

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0);

  1. dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);  
  2. dispatch_group_t group = dispatch_group_create();  
  3. dispatch_group_async(group, queue, ^{  
  4.     [NSThread sleepForTimeInterval:1];  
  5.     NSLog(@"group1");  
  6. });  
  7. dispatch_group_async(group, queue, ^{  
  8.     [NSThread sleepForTimeInterval:2];  
  9.     NSLog(@"group2");  
  10. });  
  11. dispatch_group_async(group, queue, ^{  
  12.     [NSThread sleepForTimeInterval:3];  
  13.     NSLog(@"group3");  
  14. });  
  15. dispatch_group_notify(group, dispatch_get_main_queue(), ^{  
  16.     NSLog(@"updateUi");  
  17. });  
  18. dispatch_release(group);  
dispatch_group_async 实现监听一组任务是否完成,任务全部完成时,通知执行其他的操作。


0 0
原创粉丝点击