【iOS系列】-iOS的多线程解析
【iOS系列】-iOS的多线程解析
iOS的多线程实现技术:
1:GCD —— Grand Central Dispatch
是基于C语言的底层API
用Block定义任务,使用起来非常灵活便捷
提供了更多的控制能力以及操作队列中所不能使用的底层函数
2:NSOperation&NSOperationQueue
是使用GCD实现的是面向对象的线程技术
提供了一些在GCD中不容易实现的特性,如:限制最大并发数量、操作之间的依赖关系
3:NSThread
使用NSThread对象建立一个线程非常方便
但是,要使用NSThread管理多个线程非常困难,不推荐使用
使用[NSThread currentThread]跟踪任务所在线程
第一:GCD
GCD是基于C语言的底层API,是队列进行任务调度,遵循FIFO先进先出
GCD的函数都是以dispatch开头的
#######队列(dispatch_queue_t):
串行队列,队列中的任务只会顺序执行
并行队列,队列中的任务通常会并发执行
#######操作:
dispatch_async 异步操作,会并发执行,无法确定任务的执行顺序
dispatch_sync 同步操作,会依次顺序执行,能够决定任务的执行顺序
#######使用
//主线程
dispatch_queue_t q = dispatch_get_main_queue();
//label:队列名称 ;attr: DISPATCH_QUEUE_SERIAL:串行 ; DISPATCH_QUEUE_CONCURRENT:并行
dispatch_queue_t q = dispatch_queue_create(const char *label, dispatch_queue_attr_t attr);
//同步任务: queue:队列名称,block:可执行的方法
dispatch_sync(dispatch_queue_t queue, ^(void)block);
//异步任务:
dispatch_async(<#dispatch_queue_t queue#>, ^(void)block);
串行队列,同步任务,不需要新建线程
串行队列,异步执行,需要一个子线程,线程的创建和回收,不需要手动参与
--最安全的选择,【只会开一个线程】
并行队列,同步任务,不需要创建线程,(如果当前任务在其他线程,不一定在主线程上执行)
并行队列,异步任务,不受控制,
无论什么队列和什么任务,线程的创建和回收不需要程序员参与。
线程的创建回收工作是由队列负责的
第二:NSOperation&NSOperationQueue
NSOperationQueue有两种不同类型的队列:主队列和自定义队列
主队列运行在主线程上
自定义队列在后台执行【所有的自定义队列,均在子线程中运行】
队列处理的任务是NSOperation的子类
1:NSInvocationOperation
2:NSBlockOperation
定义一个队列:
NSOperationQueue *myQueue = [[NSOperationQueue alloc] init];
然后把操作NSOperation加入到队列。
第一:定义NSInvocationOperation:
//id:self ; SEL: @selector(方法名) ;id:方法名有参数,就填上,没有就写nil
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:(id) selector:(SEL) object:(id)];
//加入到自定义的队列
[self.queue addOperation:op];
//加入到主队列
[[NSOperationQueue mainQueue] addOperation:op];
第二:定义NSBlockOperation:
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^(void)block];
//设置操作执行的依赖关系,执行先后顺序,
// 设置依赖关系(op2的执行,需要op1执行后才可以执行,),依赖关系是可以跨队列:几个线程相互依赖,但是最后一个线程要更新UI(主线程才能更新UI),所以最后一个线程要在主线程上执行,但是设置的依赖关系还是不变,
[op2 addDependency:op1];
//加入到主队列
[self.queue addOperation:op1];
//加入到主队列
[[NSOperationQueue mainQueue] addOperation:op4];
//NSOperation设置最大并发的线程数,一般如果是3G,开3个子线程 ;如果是WIFI,开6个子线程
[self.queue setMaxConcurrentOperationCount:2];
可以看出:NSBlockOperation比NSInvocationOperation(只能接受一个参数)更加灵活
第三:NSThread
常用的方法是
//获取当前执行的线程:
NSThread *current = [NSThread currentThread];
使用NSThread的线程,不会自动添加autoreleasepool,不能够自动回收线程,如果并发数量多,会建立大量的子线程!
【iOS系列】-iOS的多线程解析的更多相关文章
- [Android开发学iOS系列] iOS写UI的几种方式
[Android开发学iOS系列] iOS写UI的几种方式 作为一个现代化的平台, iOS的发展也经历了好几个时代. 本文讲讲iOS写UI的几种主要方式和各自的特点. iOS写UI的方式 在iOS中写 ...
- iOS系列文章
本博客全为原创,如果借鉴了其他文章会在博文的下面进行说明.欢迎转载,但要在文章中给出原文链接,谢谢. 有链接的说明已经发布,没有链接的说明还没有发布. 并不是所有的博文都在这里罗列,有兴趣的可以看博客 ...
- iOS系列教程 目录 (持续更新...)
前言: 听说搞iOS的都是高富帅,身边妹子无数.咱也来玩玩.哈哈. 本篇所有内容使用的是XCode工具.Swift语言进行开发. 我现在也是学习阶段,每一篇内容都是经过自己实际编写完一遍之后,发现 ...
- iOS系列 基础篇 03 探究应用生命周期
iOS系列 基础篇 03 探究应用生命周期 目录: 1. 非运行状态 - 应用启动场景 2. 点击Home键 - 应用退出场景 3. 挂起重新运行场景 4. 内存清除 - 应用终止场景 5. 结尾 本 ...
- iOS系列 基础篇 04 探究视图生命周期
iOS系列 基础篇 04 探究视图生命周期 视图是应用的一个重要的组成部份,功能的实现与其息息相关,而视图控制器控制着视图,其重要性在整个应用中不言而喻. 以视图的四种状态为基础,我们来系统了解一下视 ...
- iOS系列 基础篇 05 视图鼻祖 - UIView
iOS系列 基础篇 05 视图鼻祖 - UIView 目录: UIView“家族” 应用界面的构建层次 视图分类 最后 在Cocoa和Cocoa Touch框架中,“根”类时NSObject类.同样, ...
- iOS系列 基础篇 06 标签和按钮 (Label & Button)
iOS系列 基础篇 06 标签和按钮 (Label & Button) 目录: 标签控件 按钮控件 小结 标签和按钮是两个常用的控件,下面咱们逐一学习. 1. 标签控件 使用Single Vi ...
- iOS系列 基础篇 07 Action动作和输出口
iOS系列 基础篇 07 Action动作和输出口 目录: 1. 前言及案例说明 2. 什么是动作? 3. 什么是输出口? 4. 实战 5. 结尾 1. 前言及案例说明 上篇内容我们学习了标签和按钮 ...
- iOS系列 基础篇 08 文本与键盘
iOS系列 基础篇 08 文本与键盘 目录: 1. 扯扯犊子 2. TextField 3. TextView 4. 键盘的打开和关闭 5. 打开/关闭键盘的通知 6. 键盘的种类 7. 最后再扯两句 ...
随机推荐
- <Spring Cloud>入门五 hystrix
1.服务熔断 1.1引入坐标 <dependency> <groupId>org.springframework.cloud</groupId> <artif ...
- 宝塔nginx配置
虚拟机配置 server { listen 80; server_name mayibang.co *.mayibang.co; index index.php index.html index.ht ...
- Cannot delete or update a parent row: a foreign key constraint fails....
在操作”小弟“这张表时候报错 想在“小弟”上面加入数据或者更新数据,就要听老大的, 这句话后面跟着的表就是“老大”,必须老大有数据索引,“小弟“才可以加入或者更新 查看“小弟”表的外键,会发现有对“老 ...
- Java学习之并发多线程理解
1.线程简介: 世间万物会同时完成很多工作,如人体同时进行呼吸.血液循环.思考问题等活动,用户既可以使用计算机听歌也可以使用它打印文件,而这些活动完全可以同时进行,这种思想在Java中称为并发,而将并 ...
- python蛋疼的编码decode、encode、unicode、str、byte的问题都在这了
相信很多人和我一样,被python蛋疼的编码问题纠缠不清,比如下面的 私以为出现这种错误的原因还是对一些基本的编解码概念不够熟悉,下面就说说我的理解: 首先python刚出来的时候unicode还没有 ...
- SpringMVC(8) - 处理器映射
在以前的Spring版本中,用户需要在Web应用程序上下文中定义一个或多个HandlerMapping bean,以将传入的Web请求映射到适当的处理器.通过引入带注解的控制器,就不需要像之前那样定义 ...
- 【HDOJ6312】Game(博弈)
题意: 有一个1到n的序列,两个人轮流取数,取走一个数同时会取走它所有的因子,不能取者为输,两个人都按最优策略取数,问先手是否必胜 思路: #include<cstdio> #includ ...
- 【ZJOI2017 Round1练习】D2T3 counter(线段树)
题意: 思路: 预处理出b[i]代表i位置之前比a[i]小的数的个数 以每个数为结尾的组数是线段树中(1,a[i]-1) 对于a[i]换到最后,相当于线段树中(a[i]+1,n)-- 交换后b[i]又 ...
- 【BZOJ1430】小猴打架(Prufer编码)
题意:求n个点带编号生成树的不同加边序列个数 n<=10^6 思路: WJMZBMR:额.首先他们打架的关系是一颗无根树,就有n^(n-2)种情况,还有打架的顺序,是(n-1)!种,乘起来就可以 ...
- 由八数码问题引入。对BFS有更深考虑
12号到今天共研究八数码问题poj1077,首先用的是普通BFS,遇到很多问题,开始用一个二级指针作为结构成员,知道了二级指针与二维数值名的不同!http://write.blog.csdn.net/ ...