2.12Grand Central Dispatch (GCD) 在iOS4.0,你已经访问GCD。GCD提供了非常简单,但功能强大,界面并发代码的执行。你可以指定你想要在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 URLWithString:@"http://www.nwcg.gov/pms/pubs/GSTOP7.pdf%22]]; 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] |
联系客服