iOS开发——多线程OC篇&GCD实用总结

GCD实用总结

图片下载

  • 注:iOS开发中常见GCD的实用也就这些了,

先来看看之前我们经常使用的方式:

 1 static NSOperationQueue * queue;
 2
 3 - (IBAction)someClick:(id)sender {
 4     self.indicator.hidden = NO;
 5     [self.indicator startAnimating];
 6     queue = [[NSOperationQueue alloc] init];
 7     NSInvocationOperation * op = [[[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download) object:nil] autorelease];
 8     [queue addOperation:op];
 9 }
10
11 - (void)download {
12     NSURL * url = [NSURL URLWithString:@"http://www.youdao.com"];
13     NSError * error;
14     NSString * data = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
15     if (data != nil) {
16         [self performSelectorOnMainThread:@selector(download_completed:) withObject:data waitUntilDone:NO];
17     } else {
18         NSLog(@"error when download:%@", error);
19         [queue release];
20     }
21 }
22
23 - (void) download_completed:(NSString *) data {
24     NSLog(@"call back");
25     [self.indicator stopAnimating];
26     self.indicator.hidden = YES;
27     self.content.text = data;
28     [queue release];
29 }

使用 GCD 后

如果使用 GCD,以上 3 个方法都可以放到一起,如下所示:

 1 // 原代码块一
 2 self.indicator.hidden = NO;
 3 [self.indicator startAnimating];
 4 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
 5     // 原代码块二
 6     NSURL * url = [NSURL URLWithString:@"http://www.youdao.com"];
 7     NSError * error;
 8     NSString * data = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
 9     if (data != nil) {
10         // 原代码块三
11         dispatch_async(dispatch_get_main_queue(), ^{
12             [self.indicator stopAnimating];
13             self.indicator.hidden = YES;
14             self.content.text = data;
15         });
16     } else {
17         NSLog(@"error when download:%@", error);
18     }
19 });

首先我们可以看到,代码变短了。因为少了原来 3 个方法的定义,也少了相互之间需要传递的变量的封装。

block 有如下特点:

  • 程序块可以在代码中以内联的方式来定义。
  • 程序块可以访问在创建它的范围内的可用的变量。

GCD无处不在

系统提供的 dispatch 方法——最常使用

为了方便地使用 GCD,苹果提供了一些方法方便我们将 block 放在主线程 或 后台线程执行,或者延后执行。使用的例子如下:

 1 //  后台执行:
 2  dispatch_async(dispatch_get_global_queue(0, 0), ^{
 3       // something
 4  });
 5  // 主线程执行:
 6  dispatch_async(dispatch_get_main_queue(), ^{
 7       // something
 8  });
 9  // 一次性执行:
10  static dispatch_once_t onceToken;
11  dispatch_once(&onceToken, ^{
12      // code to be executed once
13  });
14  // 延迟 2 秒执行:
15  double delayInSeconds = 2.0;
16  dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
17  dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
18      // code to be executed on the main queue after delay
19  });

后台运行

使用 block 的另一个用处是可以让程序在后台较长久的运行。在以前,当 app 被按 home 键退出后,app 仅有最多 5 秒钟的时候做一些保存或清理资源的工作。但是应用可以调用 UIApplication 的beginBackgroundTaskWithExpirationHandler方法,让 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 }
时间: 2024-10-26 04:58:24

iOS开发——多线程OC篇&GCD实用总结的相关文章

iOS开发——多线程OC篇&多线程详解

多线程详解 前面介绍了多线程的各种方式及其使用,这里补一点关于多线程的概念及相关技巧与使用,相信前面不懂的地方看了这里之后你就对多线程基本上没有什么问题了! 1——首先ios开发多线程中必须了解的概念: 进程 正在进行中的程序被称为进程,负责程序运行的内存分配 每一个进程都有自己独立的虚拟内存空间 线程 线程是进程中一个独立的执行路径(控制单元) 一个进程中至少包含一条线程,即主线程 可以将耗时的执行路径(如:网络请求)放在其他线程中执行 创建线程的目的就是为了开启一条新的执行路径,运行指定的代

iOS开发——多线程OC篇&(三)线程安全

线程安全 一.多线程的安全隐患 资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题 问题代码: 1 // 2 // YYViewController.m 3 // 05-线程安全 4 // 5 // Created by apple on 14-6-23. 6 // Copyright (c) 2014年 itcase. All rights reserved

iOS开发——多线程OC篇&多线程总结

多线程总结 1 //1.NSThread 2 /** 3 优点:NSThread 比其他两个轻量级. 4 缺点:需要自己管理线程的生命周期,线程同步,线程同步时对数据的加锁会有一定的系统开销. 5 cocoa给我提供了两种方法生成线程: 6 1: 7 - (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument 8 NSThread* thread = [[NSThread alloc] initWithTa

iOS开发——多线程OC篇&(一)多线程介绍

多线程简单介绍 一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过“活动监视器”可以查看Mac系统中所开启的进程 2.什么是线程 1个进程要想执行任务,必须得有线程(每1个进程至少要有1条线程) 线程是进程的基本执行单元,一个进程(程序)的所有任务都在线程中执行 比如使用酷狗播放音乐.使用迅雷下载电影,都需要在线程中执行 3.线程的串行 1个线程中任

iOS开发——多线程OC篇&(六)多线程GCD介绍

GCD介绍 一.简单介绍 1.什么是GCD? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如双核.四核) GCD会自动管理线程的生命周期(创建线程.调度任务.销毁线程) 程序员只需要告诉GCD想要执行什么任务,不需要编写任何线程管理代码 3.提示 (1)GCD存在于libdispatch.dylib这个库中,这个调度库包含了G

iOS开发——多线程OC篇&(八)多线程GCD高级用法

GCD的常见用法 一.延迟执行 1.介绍 iOS常见的延时执行有2种方式 (1)调用NSObject的方法 [self performSelector:@selector(run) withObject:nil afterDelay:2.0]; // 2秒后再调用self的run方法 (2)使用GCD函数 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_mai

iOS开发——多线程OC篇&(七)多线程GCD简单使用

GCD的基本使用 一.主队列介绍 主队列:是和主线程相关联的队列,主队列是GCD自带的一种特殊的串行队列,放在主队列中得任务,都会放到主线程中执行. 提示:如果把任务放到主队列中进行处理,那么不论处理函数是异步的还是同步的都不会开启新的线程. 获取主队列的方式: dispatch_queue_t queue=dispatch_get_main_queue(); (1)使用异步函数执行主队列中得任务,代码示例: 1 // 2 // YYViewController.m 3 // 12-GCD的基本

iOS开发——多线程OC篇&多线程中的单例

多线程中的单例 1 #import "DemoObj.h" 2 3 @implementation DemoObj 4 5 static DemoObj *instance; 6 7 8 9 // 在iOS中,所有对象的内存空间的分配,最终都会调用allocWithZone方法 10 // 如果要做单例,需要重写此方法 11 // GCD提供了一个方法,专门用来创建单例的 12 + (id)allocWithZone:(struct _NSZone *)zone 13 { 14 sta

iOS开发——多线程OC篇&(十)多线程NSOperation基本使用

NSOperation基本操作 一.并发数 (1)并发数:同时执?行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. (3)最?大并发数的相关?方法 - (NSInteger)maxConcurrentOperationCount;- (void)setMaxConcurrentOperationCount:(NSInteger)cnt; 说明:如果没有设置最大并发数,那么并发的个数是由系统内存和CPU决定的,可能内存多久开多一点,内