首页 > GCD > iOS系统GCD学习(4):dispatch_group2

iOS系统GCD学习(4):dispatch_group2

dispatch_apply的使用

  对于同步执行,GCD提供了一个简化方法叫做dispatch_apply。这个函数调用单一block多次,并平行运算,然后等待所有运算结束,就像我们想要的那样:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_apply([array count], queue, ^(size_t index){
        [self doSomethingIntensiveWith:[array objectAtIndex:index]];
    });
    [self doSomethingWith:array];


  这很棒,但是异步咋办?dispatch_apply函数可是没有异步版本的。但是我们使用的可是一个为异步而生的API啊!所以我们只要用dispatch_async函数将所有代码推到后台就行了:

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
    dispatch_async(queue, ^{
        dispatch_apply([array count], queue, ^(size_t index){
            [self doSomethingIntensiveWith:[array objectAtIndex:index]];
        });
        [self doSomethingWith:array];
    });

dispatch_barrier_async的使用

  dispatch_barrier_async是在前面的任务执行结束后它才执行,而且它后面的任务等它执行完成之后才会执行。
  例子代码如下:

 
dispatch_queue_t queue = dispatch_queue_create("gcdtest.rongfzh.yc", DISPATCH_QUEUE_CONCURRENT); 
dispatch_async(queue, ^{ 
    [NSThread sleepForTimeInterval:2]; 
    NSLog(@"dispatch_async1"); 
}); 
dispatch_async(queue, ^{ 
    [NSThread sleepForTimeInterval:4]; 
    NSLog(@"dispatch_async2"); 
}); 
dispatch_barrier_async(queue, ^{ 
    NSLog(@"dispatch_barrier_async"); 
    [NSThread sleepForTimeInterval:4]; 
 
}); 
dispatch_async(queue, ^{ 
    [NSThread sleepForTimeInterval:1]; 
    NSLog(@"dispatch_async3"); 
}); 

  打印结果:

2012-09-25 16:20:33.967 gcdTest[45547:11203] dispatch_async1
2012-09-25 16:20:35.967 gcdTest[45547:11303] dispatch_async2
2012-09-25 16:20:35.967 gcdTest[45547:11303] dispatch_barrier_async
2012-09-25 16:20:40.970 gcdTest[45547:11303] dispatch_async3

  请注意执行的时间,可以看到执行的顺序如上所述。

  1. 还没有评论
评论提交中, 请稍候...

留言


可以使用的标签: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
Trackbacks & Pingbacks ( 0 )
  1. 还没有 trackbacks