您的位置:首页 > 移动开发 > IOS开发

ios之dispatch_async

2015-08-31 14:20 295 查看
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

#define DISPATCH_QUEUE_PRIORITY_HIGH 2

#define DISPATCH_QUEUE_PRIORITY_DEFAULT 0

#define DISPATCH_QUEUE_PRIORITY_LOW (-2)


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);

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:1];

NSLog(@"group1");

});

dispatch_group_async(group, queue, ^{

[NSThread sleepForTimeInterval:2];

NSLog(@"group2");

});

dispatch_group_async(group, queue, ^{

[NSThread sleepForTimeInterval:3];

NSLog(@"group3");

});

dispatch_group_notify(group, dispatch_get_main_queue(), ^{

NSLog(@"updateUi");

});

dispatch_release(group);

dispatch_group_async 实现监听一组任务是否完成,任务全部完成时,通知执行其他的操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: