iOS GCD实际项目运用

GCD的解释及原理网上已经有详细的介绍了,这里我就只是把自己项目中常用到的记录下来,如果大家有更多的项目运用,请留言,我会及时学习并摘录进来,让不太喜欢理论而喜欢实际操作的人学到更多。

1、耗时操作

场景:(1)耗时操作:数据量比较大,而我们不可能一直等数据请求完再来刷新UI

           (2)增量更新:先加载本地数据,再请求接口是否有更新,如果有更新,请求数据后再回到主线程更新UI,同时更新数据库

            (3)。。。。。。

/**

*  解决耗时操作 - UI + 数据请求

*/

-(void)demo1

{

    NSLog(@"star");

   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        //这里操作耗时的任务 不管block是否运行结束,都不会阻塞UI线程

        for (NSInteger i = 0; i < 10; i ++) {

            NSLog(@"你好");

        }

        // dispatch_async会向dispatch_get_global_queue全局队列去添加新的任务

        //网络请求

        //加载网络图片

        //数据解析

        dispatch_async(dispatch_get_main_queue(), ^{

            NSLog(@"执行完了 - 刷新主线程");

        });

    });

    NSLog(@"end");

}

iOS GCD实际项目运用_第1张图片
运行结果

2、多个接口操作

场景:(1)接口过多:现在一个接口越来越不能满足一个界面的需求,通常需要多个接口来管理一个界面的UI(增量更新同样可以用到

            (2)。。。。

/**

*  多个耗时操作异步执行  - 再去刷新UI

*/

-(void)demo2

{

    NSLog(@"star");

    //线程

    dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

    //创建分组

    dispatch_group_t group = dispatch_group_create();

    dispatch_group_async(group, queue, ^{

        for (NSInteger i = 0; i < 10; i ++) {

            NSLog(@"数据请求1");

        }

    });

    dispatch_group_async(group, queue, ^{

        for (NSInteger i = 0; i < 10; i ++) {

            NSLog(@"数据请求2");

        }

    });

    /**

    *  回到主线程

    */

    dispatch_group_notify(group, dispatch_get_main_queue(), ^{

        NSLog(@"刷新UI");

    });

    NSLog(@"end");

}

iOS GCD实际项目运用_第2张图片
运行结果

你可能感兴趣的:(iOS GCD实际项目运用)