【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的多线程解析的更多相关文章

  1. [Android开发学iOS系列] iOS写UI的几种方式

    [Android开发学iOS系列] iOS写UI的几种方式 作为一个现代化的平台, iOS的发展也经历了好几个时代. 本文讲讲iOS写UI的几种主要方式和各自的特点. iOS写UI的方式 在iOS中写 ...

  2. iOS系列文章

    本博客全为原创,如果借鉴了其他文章会在博文的下面进行说明.欢迎转载,但要在文章中给出原文链接,谢谢. 有链接的说明已经发布,没有链接的说明还没有发布. 并不是所有的博文都在这里罗列,有兴趣的可以看博客 ...

  3. iOS系列教程 目录 (持续更新...)

      前言: 听说搞iOS的都是高富帅,身边妹子无数.咱也来玩玩.哈哈. 本篇所有内容使用的是XCode工具.Swift语言进行开发. 我现在也是学习阶段,每一篇内容都是经过自己实际编写完一遍之后,发现 ...

  4. iOS系列 基础篇 03 探究应用生命周期

    iOS系列 基础篇 03 探究应用生命周期 目录: 1. 非运行状态 - 应用启动场景 2. 点击Home键 - 应用退出场景 3. 挂起重新运行场景 4. 内存清除 - 应用终止场景 5. 结尾 本 ...

  5. iOS系列 基础篇 04 探究视图生命周期

    iOS系列 基础篇 04 探究视图生命周期 视图是应用的一个重要的组成部份,功能的实现与其息息相关,而视图控制器控制着视图,其重要性在整个应用中不言而喻. 以视图的四种状态为基础,我们来系统了解一下视 ...

  6. iOS系列 基础篇 05 视图鼻祖 - UIView

    iOS系列 基础篇 05 视图鼻祖 - UIView 目录: UIView“家族” 应用界面的构建层次 视图分类 最后 在Cocoa和Cocoa Touch框架中,“根”类时NSObject类.同样, ...

  7. iOS系列 基础篇 06 标签和按钮 (Label & Button)

    iOS系列 基础篇 06 标签和按钮 (Label & Button) 目录: 标签控件 按钮控件 小结 标签和按钮是两个常用的控件,下面咱们逐一学习. 1. 标签控件 使用Single Vi ...

  8. iOS系列 基础篇 07 Action动作和输出口

    iOS系列 基础篇 07 Action动作和输出口 目录:  1. 前言及案例说明 2. 什么是动作? 3. 什么是输出口? 4. 实战 5. 结尾 1. 前言及案例说明 上篇内容我们学习了标签和按钮 ...

  9. iOS系列 基础篇 08 文本与键盘

    iOS系列 基础篇 08 文本与键盘 目录: 1. 扯扯犊子 2. TextField 3. TextView 4. 键盘的打开和关闭 5. 打开/关闭键盘的通知 6. 键盘的种类 7. 最后再扯两句 ...

随机推荐

  1. composer 插件安装

    https://packagist.org/?q=phpmyadmin&p=0 Github:笔记 https://github.com/13431/php 类库包下载地址:packagist ...

  2. Mysql when case 批量更新

    UPDATE categories SET display_order = CASE id WHEN 1 THEN 3 WHEN 2 THEN 4 WHEN 3 THEN 5 END WHERE id ...

  3. 同一SQL语句在PLSQL Developer与SQL * PLUS工具中执行结果不一致

    背景 今天遇到如下问题,同一sql语句在PLSQL Developer与SQL*PLUS工具中执行结果不一致, sql语句如下 SELECT 'GROUPHEALTH_SEND_EMAIL' as i ...

  4. 树梅派 -- 通过/sys读写ADC芯片 pcf8591

    通过wiringPi等library, 在user space 通过/dev/i2c来读写i2c设备的方案不在本文讨论了. 编译SENSORS_PCF8591 模块 在Default raspberr ...

  5. Windows Server定时执行bat

    大家应该知道是在window服务器下使用bat批处理脚本文件,如果是Linux操作系统则是使用xshell脚本文件.由于自己是在做项目的时候对于文件系统中的日志进行定期删除对bat和xshell进行简 ...

  6. 如何在Python中显式释放内存?

    根据Python官方文档,您可以强制垃圾收集器释放未引用的内存gc.collect().例: import gc gc.collect() 所属网站分类: python高级 > 综合&其 ...

  7. 第三天,小作业,表达式,while循环

    num += 1 等价于 num = num + 1num -= 1 等价于 num = num - 1num *= 2 等价于 num = num * 2num /= 2 等价于 num = num ...

  8. [NOIP1998] 提高组 洛谷P1013 进制位

    题目描述 著名科学家卢斯为了检查学生对进位制的理解,他给出了如下的一张加法表,表中的字母代表数字. 例如: L K V E L L K V E K K V E KL V V E KL KK E E K ...

  9. 【CF766D】Mahmoud and a Dictionary(并查集)

    题意:有n个单词,给定m个关系,每个关系要么表示单词a与单词b相同,要么表示单词a与单词b相反. 并且“相同”与“相反”有性质:若a与b相同,b与c相同,则a与c相同(从而单词的相同关系是等价关系): ...

  10. 使用 Apache Lucene 和 Solr 4 实现下一代搜索和分析

    使用 Apache Lucene 和 Solr 4 实现下一代搜索和分析 使用搜索引擎计数构建快速.高效和可扩展的数据驱动应用程序 Apache Lucene™ 和 Solr™ 是强大的开源搜索技术, ...