iOS GCD(8)
});
使用dispatch_barrier_async方法,它会等待在它之前添加到 Concurrent Dispatch Queue的所有处理执行结束后,才执行该处理,然后等待该处理结束后,才接着处理后续添
加到Concurrent Dispatch Queue中的处理任务。当然在dispatch_barrier_async方法之前和之后添加的处理任务可以并发执行,即不保证执行顺序,但是可以确保
dispatch_barrier_async方法添加的任务一定是只能同时执行一个,按其添加任务顺序执行的,就是说,执行完blk1_reading和blk2_reading的读取数据任务后,才是进行
blk1_writting的写入数据任务,然后才是执行接着的读取数据的任务。
7、dispatch——sync
dispatch_async方法中的async意味着“非同步”,就是将指定的block非同步的添加到dispatch qeueue中,dispatch_async方法不做任何等待。
dispatch_sync方法中的sync意味着“同步”,也就是将指定的block同步追加到dispatch queue中,在追加block的过程结束之前,dispatch_sync方法会一直等待。
一旦调用dispatch_sync,那么在指定的处理执行结束之前,该方法不会返回,dispatch_sync方法可以简化代码,也可以说是简易版的dispatch_group_wait方法
dispatch_sync方法使用简单,但是容易引起死锁
[cpp]
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{
NSLog(@"引起死锁!");
});
dispatch_queue_t queue = dispatch_get_main_queue();
dispatch_sync(queue, ^{
NSLog(@"引起死锁!");
});
上面的代码在主线程中执行指定的block,并等待其执行结束,但是其实在主线程中就是在执行这些代码,所以就造成了死锁。
8、dispatch_apply
dispatch_apply 方法是 dispatch_sync 方法和Dispatch Group的关联API,该方法按指定的次数将指定的Block追加到指定的Dispatch Queue中,并等待全部处理执行结束
[cpp]
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(10, queue, ^(size_t index){
NSLog(@"%zu",index);
});
NSLog(@"done");
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(10, queue, ^(size_t index){
NSLog(@"%zu",index);
});
NSLog(@"done");
因为是在Global Dispatch Queue中执行处理,所以各个处理的执行时间不定,也就是说输出1 2 3 ...的顺序不定。但是输出结果done必定是在最后的位置上的。因为dispatch_apply会等待所以的处理任务执行结束。
dispatch_apply 中的第一个参数是重复次数,第二个参数是追加对象的Dispatch Queue,第三个参数为追加的处理block,注意带参数
[cpp]
//假如对一个NSArray类对象的所有元素执行处理时,不必一个个编写for循环
相关新闻>>
- 发表评论
-
- 最新评论 更多>>