多线程GCD用法

 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

多线程GCD用法的相关文章

iOS多线程 GCD

iOS多线程 GCD Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取. /*! * @function dispatch_get_main_queue * * @abstract * Returns the default queue that is bound to the main thread. *

iOS多线程GCD

Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispatch_get_main_queue获取. /*! * @function dispatch_get_main_queue * * @abstract * Returns the default queue that is bound to the main thread. * * @discussi

ios中的多线程的用法总结

ios中的多线程的用法总结 1.进程的基本概念 (1)每一个进程都是一个应用程序,都有独立的内存空间,一般来说一个应用程序存在一个进程,但也有多个进程的情况 (2)同一个进程的线程共享内存中的内存和资源 2.多线程的基本概念 (1)每一个程序都有一个主线程,程序启动时创建(调用main来启动). (2)多线程技术表示,一个应用程序有多个线程,使用多线程能提供CPU的利用率,防止主线程被堵塞. (3)任何有可能堵塞主线程的任务不要在主线程执行(如:访问网络). (4)主线程的生命周期和应用程序绑定

关于ios多线程GCD的简单介绍

很久没写博客了,实在太忙了,没有时间写.现在终于空闲下来了,今天就给大家介绍下ios开发里GCD的用法. 刚开始学习的新手,或许对多线程很迷茫,那么什么是线程呢?其实很简单,不要想那么复杂. 1.我们通常知道进程,就是正在执行中的程序,每个进程有自己独立的内存空间,进程之间互相不干涉.(就比如你打开微信) 2.什么是线程?线程是进程执行的基本单元.进程中的任务是在线程中执行的,进程在启动后会自动蜕化为主线程(ios UI Main thread),然后在执行任务. 3.线程的串航执行,比如我要下

Python爬虫进阶五之多线程的用法

前言 我们之前写的爬虫都是单个线程的?这怎么够?一旦一个地方卡到不动了,那不就永远等待下去了?为此我们可以使用多线程或者多进程来处理. 首先声明一点! 多线程和多进程是不一样的!一个是 thread 库,一个是 multiprocessing 库.而多线程 thread 在 Python 里面被称作鸡肋的存在!而没错!本节介绍的是就是这个库 thread. 不建议你用这个,不过还是介绍下了,如果想看可以看看下面,不想浪费时间直接看 multiprocessing 多进程 鸡肋点 名言: "Pyt

多线程 GCD

n多线程 GCD n简介 n什么是GCD p全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” p纯C语言,提供了非常多强大的函数 p nGCD的优势 pGCD是苹果公司为多核的并行运算提出的解决方案 pGCD会自动利用更多的CPU内核(比如双核.四核) pGCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程) p程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码 n任务和队列 nGCD中有2个核心概念 p任务:执行什么操作 p队列:用来存放任

IOS 多线程GCD的使用[转载于新浪微博, 原作者:太阳石]

原文 在红黑联盟上看到一篇关于多线程GCD的教程文章,写的深入浅出,特转载于此,以备不时之需.原文链接另:补充两个GCD代码,都是Xcode snippet里面提供的:1.Dispatch After主要用于延迟执行一些代码.例子: int64_t delayInSeconds = 1.0; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); dispatch_aft

【iOS】多线程GCD

GCD(Grand Central Dispatch) : 牛逼的中枢调度器.苹果自带,纯C语言实现,提供了非常多且强大的函数,它可以提高代码的执行效率与多核的利用率. 一.GCD的基本使用 1.GCD中的两个核心概念: ?任务: 执行什么任务. ?队列: 用来存放任务. (用来调度任务) 2.GCD使用的2个步骤: ?1.定制任务. (确定想做的事情) ?2.将任务添加到队列中. ?GCD会自动将队列中的任务取出, 放到对应的线程中执行. ?遵循队列的FIFO原则: 先进先出. 3.同步和异步

iOS开发之多线程——GCD介绍

iOS开发之多线程——GCD的介绍 一.简单介绍 1.GCD ( Grand Central Dispatch) 可以翻译为“中枢调度器”.纯C语言,并且提供了非常强大的函数. 2.GCD 有什么优势: GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多地CPU 内核 (比如双核.四核) GCD会自动管理线程的生命周期 (创建线程.调度任务.销毁线程) 程序猿只需要告诉GCD想要执行设呢任务,不需要编写任何线程管理代码. 二.任务和队列 GCD中有两个核心概念 (1)任务: 执