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 函数。