多线程编程也称之为并发编程,由于其作用大,有比较多的理论知识,因此在面试中也是受到面试官的青睐。在日常项目开发中,至少网络请求上是需要使用到多线程知识的,虽然使用第三方的框架比如AFNetworking进行网络请求比较简单,但是也是需要开发人员对多线程、block等知识有比较清晰的思路,才能在遇到问题的时候,能够有条理的找出问题并解决好。

本篇文章的定位是梳理下在iOS开发中多线程的知识,也算是一个提纲,一来可以在学习或者是回顾多线程知识时候有个导向,二来也可以作为自己对多线程知识的一个检测,看自己是否能够根据这个提纲,做精细化加工。

在iOS开发中,我认为主要是三个方面的知识要非常清楚:

(一)多线程相关的知识

(二)GCD的使用

(三)NSOperation的使用

首先是,多线程相关的知识

(一)三者之间的关系:进程、线程、任务

(二)引入多线程技术:概念、原理、优缺点、应用场景

(三)线程中的任务执行是串行

(四)实现多线程的技术:pthread、NSThread、GCD、NSOperation

(五)线程的相关操作:创建、启动、运行、阻塞、销毁

(六)线程间的相关操作:数据共享、线程之间的通信

(七)关于线程的相关术语:主线程、子线程

然后是,GCD的使用

(一)在GCD中有两个概念需要明确:函数、队列

(二)两种函数:同步函数--在当前线程中执行任务,不具备开启新线程的能力

        异步函数--在新的线程中执行任务,具备开启新线程的能力

(三)两种队列:串行队列--一个任务执行完成后,再执行下一个任务

        并发队列--多个任务同时进行

(四)三种队列实例:主队列、自创建串行队列、全局并发队列

(五)公式就是:用______函数往______队列中添加任务。

组合起来就是六种情况:

用同步函数,往主队列中,添加任务--没有开启新线程、串行执行任务(这种方式会形成死循环!)

用同步函数,往自创建串行队列中,添加任务--没有开启新线程,串行执行任务

用同步函数,往全局并发队列中,添加任务--没有开启新线程、串行执行任务

用异步函数,往主队列中,添加任务--没有开启新线程、串行执行任务

用异步函数,往自创建串行队列中,添加任务--有开启新线程、串行执行任务

用异步函数,往全局并发队列中,添加任务--有开启新线程、并发执行任务(这个才是发挥GCD效能的方式!)

(六)线程间的通信:从子线程回到主线程中执行任务

(七)GCD常用方式:延迟执行、一次性执行、队列组的使用

最后是,NSOperation的使用

对NSOperation主要是两个大块:NSOperation子类的使用、NSOperation与NSOperationQueue的结合使用。

首先NSOperation是抽象类,不能直接使用其实例化。NSOperation子类的使用有三种方式:

(一)NSInvocationOperation类

将任务放置在该类的实例化对象中,然后执行,一个NSInvocationOperation对象中只能放置一个任务。单独这样使用,任务都是在主线程中执行的,只有将该类的实例化对象添加到NSOperationQueue队列中使用,才会开启新线程执行任务。

(二)NSBlockOperation类

该类和NSInvocationOperation类的区别是,一个NSBlockOperation对象可以放置多个任务,然后在调用执行方法。若添加到NSBlockOperation对象中的任务数>1,就会开启新的线程异步执行任务。

(三)自定义NSOperation子类

然后就是NSOperation与NSOperationQueue的结合使用,结合使用无非就是创建一个NSOperationQueue对象,然后将NSOperation的子类的实例化对象添加到NSOperationQueue对象中,有两个方面需要注意:

(一)NSOperationQueue的配置:设置最大并发数、设置任务的优先级、设置任务间的依赖关系、设置任务完成后的监听回调。

(二)NSOperationQueue的操作:取消所有或者单个任务、暂停或者恢复任务。

值得一提的应用场景,比如用UITableView加载很多数据显示的过程,网络请求和数据解析的确是放置在子线程中异步进行,不能放置在UI主线程中来进行这么耗时的操作,不然UI界面就会被“卡死”。但是开线程毕竟也是需要内存的,子线程在执行任务的时候也的确是需要消耗性能的,这样一来多多少少也是会对UI界面造成影响的,比如滑动界面的使用发现有稍微的不流畅?因此为了更好的提高用户体验,对多线程更可控,可以使用NSOperationQueue队列的暂停任务的操作,当用户在滑动界面时,暂停其他耗性能的子线程的活动。

iOS多线程编程的知识梳理的更多相关文章

  1. iOS多线程编程指南

    iOS多线程编程指南(拓展篇)(1) 一.Cocoa 在Cocoa上面使用多线程的指南包括以下这些: (1)不可改变的对象一般是线程安全的.一旦你创建了它们,你可以把这些对象在线程间安全的传递.另一方 ...

  2. iOS多线程编程原理及实践

    摘要:iOS开发中,开发者不仅要做好iOS的内存管理,而且如果你的iOS涉及多线程,那你也必须了解iOS编程中对多线程的限制,iOS主线程的堆栈大小为1M,其它线程均为512KB,且这个限制开发者是无 ...

  3. IOS高级编程之三:IOS 多线程编程

    多线程的概念在各个操作系统上都会接触到,windows.Linux.mac os等等这些常用的操作系统,都支持多线程的概念. 当然ios中也不例外,但是线程的运行节点可能是我们平常不太注意的. 例如: ...

  4. iOS多线程编程

    废话不多说,直接上干货.先熟悉一下基本知识,然后讲一下常用的两种,NSOperation和GCD. 一.基础概念 进程: 狭义定义:进程是正在运行的程序的实例(an instance of a com ...

  5. iOS多线程编程Part 1/3 - NSThread & Run Loop

    前言 多线程的价值无需赘述,对于App性能和用户体验都有着至关重要的意义,在iOS开发中,Apple提供了不同的技术支持多线程编程,除了跨平台的pthread之外,还提供了NSThread.NSOpe ...

  6. iOS多线程编程指南(一)关于多线程编程(转)

    原文:http://www.dreamingwish.com/article/ios-multi-threaded-programming-a-multi-threaded-programming.h ...

  7. iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD

    原文出处: 容芳志的博客 简介iOS有三种多线程编程的技术,分别是:(一)NSThread(二)Cocoa NSOperation(三)GCD(全称:Grand Central Dispatch) 这 ...

  8. iOS多线程编程(四)------ GCD(Grand Central Dispatch)

    一.简单介绍 是基于C语言开发的一套多线程开发机制.也是眼下苹果官方推荐的多线程开发方法.用起来也最简单.仅仅是它基于C语言开发,并不像NSOperation是面向对象的开发.而是全然面向过程的.假设 ...

  9. iOS多线程编程Part 2/3 - NSOperation

    多线程编程Part 1介绍了NSThread以及NSRunLoop,这篇Blog介绍另一种并发编程技术:NSOPeration. NSOperation & NSOperationQueue ...

随机推荐

  1. Oracle Data Guard搭建 1.虚拟机安装linux

    1.安装虚拟机 VMware 14 2.下载Linux镜像文件,创建虚拟机

  2. linux异常 - 弹出界面 eth0:设备eth0似乎不存在

    问题描述: 用VMware vSphere Client复制虚拟机之后,出现这个问题 解决方法: service network stop service NetworkManager restart

  3. sql查询 —— 模糊查询

    --模糊查询 --like --%至少替换一个 -- _只替换一个 -- 查姓李的人 select *from student name like "李%"; -- 查名为杰伦的人 ...

  4. python3练习100题--024

    因为过生日,好几天没做题了,有点松懈. 我要更加加油啦-为了打败现在每天都厌恶的生活! 原题链接:http://www.runoob.com/python/python-exercise-exampl ...

  5. 剑指offer 面试题. 滑动窗口的最大值

    题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6 ...

  6. Federal Learning(联邦学习)认知

    本人是学生党,同时也是小菜鸡一枚,撞运气有机会能够给老师当项目助理,在这个过程中肯定会学到一些有趣的知识,就在此平台上记录一下,在知识点方面有不对的还请各位指正. What(什么是联邦学习?) 联邦学 ...

  7. util之PriorityQueue

    定义: PriorityQueue<Integer> queue = new PriorityQueue<Integer>(); java中的优先队列默认从小到大 //自定义 ...

  8. quartus 9.0 对话框显示不完整

    今天在quartus9.0新建SOPC build时,发现在添加PLL时对话框太大,笔记本分辨率差,导致结束和next不能选择: 解决: 如果电脑分辨率可以调整为合适的,就去调整: 现在介绍分辨率不合 ...

  9. Java-POJ1007-DNA Sorting

    题目大意: 你的任务是分类DNA字符串(只有ACGT四个字符,所有字符串长度相同). 根据逆序数,排序程度从好到差. 第一次用到了“类”,和c++里的结构体有类似之处 一次AC,简单暴力的冒泡排序,要 ...

  10. AcWing 905. 区间选点

    //1.将每个区间按右端点从小到大排序 //2.从前往后依次枚举每个区间,如果当前区间中已经包含点,就直接跳过,否则,选择当前区间的右端点 //选右端点的话,可以尽可能的包含在多个区间里 #inclu ...