zoukankan      html  css  js  c++  java
  • 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 函数。 
  • 相关阅读:
    李白—烂尾楼题记
    [原创]网络图片延迟加载实现,超越jquery2010年3月26日
    利用反射,泛型,扩展方法快速获取表单值到实体类
    断点续传 到底是很么
    认识LINQ
    Gridview控件用法大总结
    网站性能优化总结。
    JQ小技巧
    自己写的jq_3个小插件
    MOSS中SPuser类的使用
  • 原文地址:https://www.cnblogs.com/safiri/p/4078587.html
Copyright © 2011-2022 走看看