1 // 后台执行: 2 dispatch_async(dispatch_get_global_queue(0, 0), ^{ 3 // something 4 }); 5 6 // 主线程执行: 7 dispatch_async(dispatch_get_main_queue(), ^{ 8 // something 9 }); 10 11 // 一次性执行: 12 static dispatch_once_t onceToken; 13 dispatch_once(&onceToken, ^{ 14 // code to be executed once 15 }); 16 17 // 延迟2秒执行: 18 double delayInSeconds = 2.0; 19 dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 20 dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 21 // code to be executed on the main queue after delay 22 }); 23 24 // 自定义dispatch_queue_t 25 dispatch_queue_t urls_queue = dispatch_queue_create("blog.yang99.com", NULL); 26 dispatch_async(urls_queue, ^{ 27 // your code 28 }); 29 dispatch_release(urls_queue); 31 // 合并汇总结果 32 dispatch_group_t group = dispatch_group_create(); 33 dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{ 34 // 并行执行的线程一 35 }); 36 dispatch_group_async(group, dispatch_get_global_queue(0,0), ^{ 37 // 并行执行的线程二 38 }); 39 dispatch_group_notify(group, dispatch_get_global_queue(0,0), ^{ 40 // 汇总结果 41 });
下面是一个利用GCD后台下载图片,并在主线程中显示的核心代码:
1 - (void)initializeUserinterface{ 2 self.indictorImageView.hidden = NO; 3 [self.indictorImageView startAnimating]; 4 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 5 NSURL *url = [NSURL URLWithString:@"http://www.youdao.com"]; 6 NSError *error; 7 NSString *data = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error]; 8 if (data != nil) { 9 dispatch_async(dispatch_get_main_queue(), ^{ 10 [self.indictorImageView stopAnimating]; 11 self.indictorImageView.hidden = YES; 12 self.contentLabel.text = data;//文本显示 13 NSLog(@"data = %@",data); 14 [_webViewss loadHTMLString:data baseURL:url];//加载网页 15 }); 16 }else{ 17 NSLog(@"error when download:%@",error); 18 } 19 }); 20 }
GCD的另一个用处是可以让程序在后台较长久的运行。
在没有使用GCD时,当app被按home键退出后,app仅有最多5秒钟的时候做一些保存或清理资源的工作。但是在使用GCD后,app最多有10分钟的时间在后台长久运行。这个时间可以用来做清理本地缓存,发送统计数据等工作。让程序在后台长久运行的示例代码如下:
1 // AppDelegate.h文件 2 @property (assign, nonatomic) UIBackgroundTaskIdentifier backgroundUpdateTask; 3 4 // AppDelegate.m文件 5 - (void)applicationDidEnterBackground:(UIApplication *)application 6 { 7 [self beingBackgroundUpdateTask]; 8 // 在这里加上你需要长久运行的代码 9 [self endBackgroundUpdateTask]; 10 } 11 12 - (void)beingBackgroundUpdateTask 13 { 14 self.backgroundUpdateTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 15 [self endBackgroundUpdateTask]; 16 }]; 17 } 18 19 - (void)endBackgroundUpdateTask 20 { 21 [[UIApplication sharedApplication] endBackgroundTask: self.backgroundUpdateTask]; 22 self.backgroundUpdateTask = UIBackgroundTaskInvalid; 23 }
总结自:唐巧iOS开发进阶
时间: 2024-12-24 08:06:40