.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. javaWeb技术第一篇之HTML

    <!-- 当前是最简的html --> <html> <!-- 告诉浏览器当前是一个html文档 最外面的标签. --> <head> <!--h ...

  2. Linux-正则、grep、sed学习笔记

    一.正则和grep 正则表达式的实现分成了两类: 基本正则表达式(BRE)和扩展的正则表达式(ERE). BRE 和 ERE 之间有什么区别呢?这是关于元字符的问题.BRE 可以辨别以下元字符: ^ ...

  3. Google Chome浏览器下如何开发UHF读写器

    google Chrome浏览器不支持ocx,也就不能通过ocx来连接UHF读写器,只能使用RFID读写器云服务插件,通过javascript语言来连接和操控UHF读写器YW-602H.RFID读写器 ...

  4. ActiveMQ持久化到MySQL以及使用SSL协议通讯

    最近公司事情稍微少了点,研究下怎么优化几个系统的交互,因为我们目前使用的是长链接的同步接口,就考虑用下MQ来处理下.由于公司对安全有要求且和CA业务有关,则使用了SSL协议.此文使用的是Activem ...

  5. MySQL 事务提交 --不良好的事务习惯。

    MySQL 事务提交 --不良好的事务习惯 我们知道"事务"是数据库区别于文件系统的重要特性之一.MySQL的InnoDB引擎中的事务也完全符合ACID(原子性 一致性 隔离性 持 ...

  6. C#&.Net干货分享-构建后台自动定时任务的源码

    1.创建一个自动处理中心任务参数的类,直接源码: namespace Frame.AutoProcess{    /// <summary>    /// 委托(用于异步处理任务)    ...

  7. Hive表的几种存储格式

    Hive的文件存储格式: textFile textFile为默认格式 存储方式:行存储 缺点:磁盘开销大:数据解析开销大:压缩的text文件,hive无法进行合并和拆分 sequencefile 二 ...

  8. MySQL-python终于安装成功了

    所有的所有全是驱动搞的鬼, 针对我的Win7 64位 Python2.7 用的wamp环境继承的mysql(或者卸载wamp环境单独安装Mysql)这里一定要用这个MySQL-python-1.2.3 ...

  9. echarts js报错 Cannot read property 'getAttribute' of null

    本文将为您描述如何解决 eharts.js报错 Uncaught TypeError: Cannot read property 'getAttribute' of null 的问题 根据报错信息查找 ...

  10. Linux:解压缩工具的管理与使用

    Linux的压缩格式有三种 1.TAR压缩格式 2.ZIP压缩格式 3.RAR压缩格式 TAR压缩包 TAR(Tape Archive,TAR)是 Linux 下的包管理工具,具有 5 种功能:打包. ...