GCD 的理解

来源:互联网 发布:linux 查看启动的服务 编辑:程序博客网 时间:2024/05/16 11:00

对于一些功能,必须得把下载过程放到后台线程进行处理,否则会阻塞UI线程显示。

系统提供的dispatch 方法。为了方便使用GCD,苹果提供了一些方法方便我们将block放在主线程或者后台线程执行.或者延后执行,使用的例子如下所示

// 后台执行

 dispatch_async(dispatch_get_global_queue(0, 0), ^{
            // something
        });


//  主线程执行

 dispatch_async(dispatch_get_main_queue(), ^{
        // something
    });

//  一次性执行

 static dispatch_once_t onceToken;

    dispatch_once(&onceToken,^{

        // code to be executed once
    });

// 延迟2秒执行

 double delayInseconds = 2.0;
    
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInseconds * NSEC_PER_SEC);
    
    dispatch_after(popTime, dispatch_get_main_queue(), ^{
        
        // code to be executed on the main queue after delay
    });

另外,GCD 还有一些高级用法,例如然后后天俩个线程并行运行,然后等两个线程都结束后,再汇总执行结果,这个可以用dispatch_group . dispatch_group_async 和 dispatch_group_notify 来实现,


dispatch_group_t group = dispatch_group_create();
    
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        // 并行执行的线程1
    });
    
    dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{
        // 并行执行的线程2
    });
    
    dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{
        // 汇总结果
    });

修改block 之外的变量

默认情况下,在程序块中访问的外部变量是复制过去的,即写操作不对原变量生效,但是你可以加上__block 来让其写操作生效,

__block int a = 0;

void (^foo)(void) = ^{

   a = 1;

}

foo ();

// 这里,a  的值被修改为1


后台运行

使用block 的另一个用处是可以让程序在后台长久的运行,在以前,当应用被按Home,键退出后,应用仅有最多5秒钟的时间做一些保存或清理资源的工作,但是应用可以调用UIApplication 的beginBackgoundTaskWithExpirtionHandler方法,让应用最多有10分钟的时间在后台长久运行,这个时间可以用来做清理本地缓存,发送统计数据等工作。

总结来说,GCD能够极大的方便开发者进行多线程编程,大家应该尽量使用GCD来处理后台线程,和UI线程的交互。






0 0
原创粉丝点击