dispatch

来源:互联网 发布:末代沙皇公主知乎 编辑:程序博客网 时间:2024/04/19 06:39

Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法。该方法在Mac OS X 10.6雪豹中首次推出,并随后被引入到了iOS4.0中。GCD是一个替代诸如NSThread, NSOperationQueue, NSInvocationOperation等技术的很高效和强大的技术,它看起来象就其它语言的闭包(Closure)一样(在Swift确实成为了闭包),但苹果把它叫做blocks。

我们一般使用如下的dispatch方法:

image

解释:

第一句是异步执行,第二句是延迟异步执行,第三句是先后台运行,再更新UI

dispatch_get_main_queue 代表应用主线程执行,可以在内部更新UI(并不会阻塞主线程)

dispatch_get_global_queue 代表在系统后台运行,不一定和UI在同一线程,不能更新UI,适用于网络处理与Core Data等的处理。

 

修改block之外的变量

访问变量

默认情况下,在程序块中访问的外部变量是赋值(assign)过去的,即写操作不对原变量生效。但是你可以加上 __block来让其写操作生效,示例代码如下: 

__block int a = 0;  
    void  (^foo)(void) = ^{  
        a = 1;  
        }  
    foo();  
    // 这里,a的值被修改为1

访问对象

如果是在代码块内部访问self等对象,建议用弱指针引用后再在代码块(闭包)中使用

OC 中

__weak __typeof(&*self) ws = self;

Swift中,在闭包内声明

[unowned self]

 

另外

GCD还有一些高级用法,例如让后台2个线程并行执行,然后等2个线程都结束后,再汇总执行结果。这个可以用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), ^{  
        // 并行执行的线程一  
        });  
    dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{  
        // 并行执行的线程二  
        });  
    dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{  
        // 汇总结果  
        });

原创粉丝点击