分享

Grand Central Dispatch (GCD)

 昵称8455184 2011-12-31

iOS4高级编程 第二章 2.12 Grand Central Dispatch (GCD)


2.12Grand Central Dispatch (GCD)
iOS4.0,你已经访问GCDGCD提供了非常简单,但功能强大,界面并发代码的执行。你可以指定你想要在block中执行的代码块,安排它在队列中执行。[/color]
[color=#231f20]
我们已经讨论了blocks在上一章,所以让我们开始谈论有关队列。[/color]
[color=#231f20]
2.12.1队列[/color]
[color=#231f20]
有三种队列对你来说是可用的:[/color]
[color=#231f20]? Main. 这个队列串行执行连续的blocks,并确保在主线程上运行块。[/color]
[color=#231f20]? Concurrent. 此队列提供blocks的执行,同时与先入先出的顺序。它为你管理线程。[/color]
[color=#231f20]? Serial. 这个队列执行blocks时间与先入先出的顺序组成部分之一。[/color]
[color=#231f20]获得并发队列,你使用dispatch_get_global_queue(),声明如下:[/color]
[color=#231f20]dispatch_queue_t
dispatch_get_global_queue(long priority, unsigned long flags);
第一个参数是队列的优先级,第二个供日后使用。你可以指定0为默认优先级,2是高优先级,-2是低优先级。系统在所有高优先级队列已经执行后,再执行默认优先级队列条目。队列中低优先级的条目在高优先级和默认优先级队列执行之后执行。你传递falgs参数为0值。[/color]
[color=#231f20]
获得main队列,你使用函数dispatch_get_main_queue().
创建一个新的队列,你使用函数dispatch_queue_create(),声明如下:[/color]
[color=#231f20]dispatch_queue_t dispatch_queue_create(
const char *label
dispatch_queue_attr_t attr);
label通常是一个reverse-DNS字符串,像com.examples.iphone,和第二个参数目前必须是NULL。注意你需要释放队列,当你调用dispatch_release()方法完毕。[/color]
[color=#231f20]
2.12.2 计划任务[/color]
[color=#231f20]
要在后台运行一个复杂的任务,并允许用户界面做出响应,而这样做,你可以写成这样[/color]
[color=#231f20]dispatch_async(dispatch_get_global_queue(0, 0), ^{
// perform long running task in background
});
这里我们通过一个队列(并发队列)和block,使用dispatch_async()函数。[/color]
[color=#231f20]
2.12.3将其组合在一起[/color]
[color=#231f20]
比方说你想在后台从网上下载一个PDF文件。下面的代码告诉你怎么做:[/color]
[color=#231f20]
- (IBAction) download{
navigationController.navigationBar.topItem.
rightBarButtonItem.enabled = NO;
dispatch_async(dispatch_get_global_queue(0, 0), ^{
NSData *data = [NSDatadataWithContentsOfURL:
[NSURL
dispatch_async(dispatch_get_main_queue(), ^{
RootViewController *root =(RootViewController*)
navigationController.topViewController;
[root showPDF:data];
navigationController.navigationBar.topItem.
rightBarButtonItem.enabled = YES;
});
});
}
当然,这个例子调用了好多API,将会通过这个文字介绍给你。你需要知道的是,在后台下载了PDF文件后,我们安排了在主线程展示PDF文件,通过使用main队列调用dispatch_async(),但在main队列,而不是在并发队列中传递。[/color]
[color=#231f20]
使用GCD完成后台处理完整的应用程序,你可以在源码下载中找GCD工程。[color=#231f20][/color]


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多