.iOS的三种多线程技术                    
.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程)
.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题
ØNSOperation/NSOperationQueue 面向对象的线程技术
ØGCD —— Grand Central Dispatch(派发) 是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术 以上这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使用的,在项目中很多框架技术分别使用了不同多线程技术。 .三种多线程技术的对比                      •NSThread:
–优点:NSThread 比其他两个轻量级,使用简单
–缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销 •NSOperation:
–不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上
–NSOperation是面向对象的 •GCD:
–Grand Central Dispatch是由苹果开发的一个多核编程的解决方案。iOS4.+才能使用,是替代NSThread, NSOperation的高效和强大的技术
–GCD是基于C语言的 .三种多线程技术的实现                      
3.1. NSThread的多线程技术,                                            > 类方法直接开启后台线程,并执行选择器方法 detachNewThreadSelector    // 新建一个线程,调用@selector方法 [NSThread detachNewThreadSelector:@selector(bigDemo) toTarget:self withObject:nil]; > 成员方法,在实例化线程对象之后,需要使用start执行选择器方法 initWithTarget   // 成员方法
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(bigDemo) object:nil]; // 启动start线程
[thread start]; 对于NSThread的简单使用,可以用NSObject的performSelectorInBackground替代 // performSelectorInBackground是将bigDemo的任务放在后台线程中执行 [self performSelectorInBackground:@selector(bigDemo) withObject:nil]; 同时,在NSThread调用的方法中,同样要使用autoreleasepool进行内存管理,否则容易出现内存泄露。   // 自动释放池 // 负责其他线程上的内存管理,在使用NSThread或者NSObject的线程方法时,一定要使用自动释放池 // 否则容易出现内存泄露。 @autoreleasepool {   } 3.2 NSOperation,面向对象的多线程技术                                        > 使用步骤: ) 实例化操作 // 实例化操作队列
_queue = [[NSOperationQueue alloc] init]; a) NSInvocationOperation NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(opAction) object:nil]; // 如果使用start,会在当前线程启动操作
// [op1 start]; // 1. 一旦将操作添加到操作队列,操作就会启动
[_queue addOperation:op1];      b) NSBlockOperation #pragma mark 模仿下载网络图像
- (IBAction)operationDemo3:(id)sender
{
// 1. 下载
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"下载 %@" , [NSThread currentThread]);
}];
// 2. 滤镜
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"滤镜 %@" , [NSThread currentThread]);
}];
// 3. 显示
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"更新UI %@" , [NSThread currentThread]);
}]; // 添加操作之间的依赖关系,所谓“依赖”关系,就是等待前一个任务完成后,后一个任务才能启动
// 依赖关系可以跨线程队列实现
// 提示:在指定依赖关系时,注意不要循环依赖,否则不工作。
[op2 addDependency:op1];
[op3 addDependency:op2];
// [op1 addDependency:op3]; [_queue addOperation:op1];
[_queue addOperation:op2];
[[NSOperationQueue mainQueue] addOperation:op3];
} ) 将操作添加到队列NSOperationQueue即可启动多线程执行 [_queue addOperation:op1];
[_queue addOperation:op2]; > 更新UI使用主线程队列 //两方式 [NSOpeationQueue mainQueue] addOperation ^{   }; [[NSOperationQueue mainQueue] addOperation:op3]; > 操作队列的setMaxConcurrentOperationCount 可以设置同时并发的线程数量! // 控制同时最大并发的线程数量
[_queue setMaxConcurrentOperationCount:]; 提示:此功能仅有NSOperation有! > 使用addDependency可以设置任务的执行先后顺序,同时可以跨操作队列指定依赖关系    // 添加操作之间的依赖关系,所谓“依赖”关系,就是等待前一个任务完成后,后一个任务才能启动 // 依赖关系可以跨线程队列实现 // 提示:在指定依赖关系时,注意不要循环依赖,否则不工作。
[op2 addDependency:op1];
[op3 addDependency:op2];
[op1 addDependency:op3]; 提示:在指定依赖关系时,注意不要循环依赖,否则不工作。 3.3. GCD,C语言                                                   GCD就是为了在“多核”上使用多线程技术 > 要使用GCD,所有的方法都是dispatch开头的 > 名词解释 global 全局 queue 队列 async 异步 sync 同步 > 要执行异步的任务,就在全局队列中执行即可 dispatch_async 异步执行控制不住先后顺序 > 关于GCD的队列 全局队列 dispatch_get_global_queue 参数:优先级 DISPATCH_QUEUE_PRIORITY_DEFAULT 始终是 dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, );
可同步 可异步 串行队列 dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_SERIAL); 是创建得到的,不能直接获取 只能同步 主队列 dispatch_get_main_queue dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"main - > %@", [NSThread currentThread]);
});
只能同歩 > 异步和同步与方法名无关,与运行所在的队列有关! 同步主要用来控制方法的被调用的顺序

iOS多线程比较的更多相关文章

  1. iOS多线程主题

    下面是:2个并发进程.和2个并发线程的示意图: 下面介绍三种多线程技术(Thread.Cocoa Operation.Grand Central Dispatch): 1.最轻量级Thread(需要自 ...

  2. iOS多线程技术方案

    iOS多线程技术方案 目录 一.多线程简介 1.多线程的由来 2.耗时操作的模拟试验 3.进程和线程 4.多线程的概念及原理 5.多线程的优缺点和一个Tip 6.主线程 7.技术方案 二.Pthrea ...

  3. iOS 多线程GCD的基本使用

    <iOS多线程简介>中提到:GCD中有2个核心概念:1.任务(执行什么操作)2.队列(用来存放任务) 那么多线程GCD的基本使用有哪些呢? 可以分以下多种情况: 1.异步函数 + 并发队列 ...

  4. iOS多线程到底不安全在哪里?

    iOS多线程安全的概念在很多地方都会遇到,为什么不安全,不安全又该怎么去定义,其实是个值得深究的话题. 共享状态,多线程共同访问某个对象的property,在iOS编程里是很普遍的使用场景,我们就从P ...

  5. iOS多线程的详情使用示例--简进祥

    大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能 ...

  6. iOS多线程

    关于iOS多线程 概述 这篇文章中,我不会说多线程是什么.线程和进程的区别.多线程有什么用,当然我也不会说什么是串行.什么是并行等问题,这些我们应该都知道的. 在 iOS 中其实目前有 4 套多线程方 ...

  7. iOS多线程学习及总结

    能有份网上的存储资料,备以后提升及参考 iOS 多线程编程 简介 一.      iOS有三种多线程编程的技术,分别是: 1.        NSThread 2.        Cocoa NSOp ...

  8. iOS多线程杂论

    iOS多线程的分布 (1) NSThread (2) NSOperation (3) GCD 现在对下面三个进行一个个的分析,希望那里说得不对的地方希望简友们帮我指点一二. 1,NSThread 优点 ...

  9. iOS多线程开发

    概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操 ...

  10. iOS多线程编程之NSThread的使用

      目录(?)[-] 简介 iOS有三种多线程编程的技术分别是 三种方式的有缺点介绍 NSThread的使用 NSThread 有两种直接创建方式 参数的意义 PS不显式创建线程的方法 下载图片的例子 ...

随机推荐

  1. ef实现一次查询多个聚合函数的字段

    想用ef来写一个统计字段的语句,如下所示 select sum(price) as price_total, sum(amount) as amount_total from table1 发现似乎实 ...

  2. requeests模块响应体属性和方法重新整理

    下面的属性方法都是基于response对象` import requests response = requests.get('url') 一.url 返回值的url 二. text 获得响应体文本信 ...

  3. Elasticsearch核心技术与实战-简介

    讲师阮一鸣介绍ebay的Pronto团队在ebay内部管理上百个Elasticsearch集群,超过4000个数据节点.在生产环境上支持的服务有 订单搜索.商品推荐.日志管理.风险控制.IT运维.安全 ...

  4. Docker启动守护式容器

    目录 启动守护式容器 查看容器日志 docker后台运行 查看容器内运行的进程 ​查看容器内部细节 进入正在运行的容器并以命令行交互 重新进入 上述两个区别 从容器内拷贝文件到主机上 启动守护式容器 ...

  5. cmd切换路径和查看路径下的文件的命令

    查看当前路径下的文件: 1.1首先敲入命令  D:  则进入D盘目录,如下图所示: 1.2进入D盘目录后,敲入命令  dir  则显示D盘下的所有文件,如下图所示: 入上所述,在Windows系统的c ...

  6. Deepin 15.9系统直接运行exe运行程序

    以下为你介绍在深度Deepin 15.9 Linux操作系统下直接运行exe文件的方法,此方法基于deepin-wine实现,经测试,一些exe文件是可以正常打开的,但部分可能会出现无法使用的情况,但 ...

  7. 图片base64编码解码

    1.图片base64编码 https://c.runoob.com/front-end/59 2.图片base64解码 https://www.it399.com/image/base64 https ...

  8. SQL Server 移位运算符

    参考链接:http://dataeducation.com/bitmask-handling-part-4-left-shift-and-right-shift/ SQL Server 官网的连接:h ...

  9. 基于UDP协议的socket套接字编程

    目录 一.UDP套接字简单示例 1.1 服务端 二.客户端 三.UPD套接字无粘包问题 3.1 服务端 3.2 客户端 四.qq聊天 4.1 服务端 4.2 客户端1 4.3 客户端2 4.4 运行结 ...

  10. beego安装错误处理

    1. 安装beego时无法安装go依赖包 解决办法: $vim ~/.bashrc export GOPROXY=https://goproxy.io $source ~/.bashrc$go get ...