GCD9: 用GCD将任务分组

由于彼此之间的依赖关系,你想将代码块分组来确保它们被 GCD 逐个执行 :
使用 dispatch_group_create 函数在 GCD 上创建一个组。 

讨论:

GCD 让我们创建组,这些组允许你把任务放到一个位置,然后全部运行,运行结束后会从 GCD 收到一个通知。 
 
这一点有很多有价值的用途。例如,假设你有一个 UI-Base APP,想在 UI 上重新加载组件。你有一个表格视图,一个滚动视图,一个图片视图,就要用这些方法加载这些组建的内容: 
- (void) reloadTableView{
/* Reload the table view here */ NSLog(@"%s", __FUNCTION__); }
- (void) reloadScrollView{
/* Do the work here */ NSLog(@"%s", __FUNCTION__); }
- (void) reloadImageView{
/* Reload the image view here */ NSLog(@"%s", __FUNCTION__); }
相关代码填全后依次调用3 个方法.我们想知道什么时候 GCD 会完成调用,那样就可以把信息展示给用户了。为了达到这个目的,我们应该使用一个组。 
 
在 GCD 中使用组的时候你应该知道 4 个函数:

dispatch_group_create

创建一个组句柄。一旦你使用完了这个组句柄,应该使用 dispatch_release 函数将其释放。

dispatch_group_async

在一个组内提交一个代码块来执行。必须明确这个代码块属于哪个组,必须在哪个派送队列上执行

dispatch_group_notify

允许你提交一个 Block Object。一旦添加到这个组的任务完成执行之后,这个 Block Object 应该被执行。这个函数也允许你明确执行 Block Object 的分派队列。

dispatch_release

这个函数释放那任何一个你通过 dispatch_group_create 函数创建的分派小组。 

 

例子:正如前面解释的,在这个例子中我们想依次调用 reloadTableView, reloadScrollView 和 reloadImageView 方法并且一旦调用完成来向用户展示信息。要做到这一点我们可以使用 GCD 强大的分组功能: 
- (void)dispatchGroup{
    dispatch_group_t taskGroup = dispatch_group_create();
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    
    dispatch_group_async(taskGroup, mainQueue, ^{
        [self reloadTableView];
    });
    dispatch_group_async(taskGroup, mainQueue, ^{
        [self reloadScrollView];
    });
    dispatch_group_async(taskGroup, mainQueue, ^{
        [self reloadImageView];
    });
    //3个任务运行完毕后,进行下一步
    dispatch_group_notify(taskGroup, mainQueue, ^{
        [[[UIAlertView alloc]initWithTitle:@"Finished" message:@"All tasks are finished" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil]show];
    });
    
    //group结束后要release自己创建的group
    //dispatch_release(taskGroup); ARC已经自动释放了
}
除了 dispatch_group_async, 你也可以分派异步的 C 函数到一个分派组来使用 dispatch_group_async_f 函数。 

 

 

posted @ 2014-11-06 13:50  safiri  阅读(318)  评论(0编辑  收藏  举报