多线程编程也称之为并发编程,由于其作用大,有比较多的理论知识,因此在面试中也是受到面试官的青睐。在日常项目开发中,至少网络请求上是需要使用到多线程知识的,虽然使用第三方的框架比如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队列的暂停任务的操作,当用户在滑动界面时,暂停其他耗性能的子线程的活动。

转载于:https://www.cnblogs.com/cchHers/p/11432271.html

iOS多线程编程的知识梳理相关推荐

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

    iOS有三种多线程编程的技术,分别是:NSThread .Cocoa NSOperation .GCD. 这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Apple最推荐使 ...

  2. 【转】iOS多线程编程技术之NSThread、Cocoa NSOperation、GCD

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

  3. 【转】Linux下的多线程编程背景知识

    1. 进程和线程 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者.传统的 Unix也支持线程的概念,但是在一个进程(pr ...

  4. iOS内存管理的知识梳理

    从作用上来说,手机内存小,划分给每个App的内存有限,合理的进行内存管理,有利于提高软件的运行性能和用户体验: 另外,内存管理是一大理论知识块,对这块知识的理解程度也是考核面试者的重要标准. 内存管理 ...

  5. iOS多线程编程之多线程简单介绍(转载)

    一.进程和线程 1.什么是进程 进程是指在系统中正在运行的一个应用程序 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内 比如同时打开QQ.Xcode,系统就会分别启动2个进程 通过& ...

  6. iOS多线程编程:线程同步总结 NSCondtion

    1:原子操作 - OSAtomic系列函数 iOS平台下的原子操作函数都以OSAtomic开头,使用时需要包含头文件<libkern/OSBase.h>.不同线程如果通过原子操作函数对同一 ...

  7. auto.js停止所有线程_Java多线程编程基础知识 概念介绍,以及线程状态

    一.进程 进程是操作系统结构的基础:是一次程序的执行:是一个程序及其数据在处理机上顺序执行时所发生的活动.操作系统中,几乎所有运行中的任务对应一条进程(Process).一个程序进入内存运行,即变成一 ...

  8. iOS多线程编程之锁的理解

    一.需要互斥的例子 在多线程环境中,无论哪个函数方法都可以在多线程中同时执行.但是,在使用共享变量时,或者在执行文件输出或者绘制图等的情况下,多线程同时执行就可能得到奇怪的结果. 例如,使用整数全局变 ...

  9. IOS 多线程编程_NSLock,NSCondition,synchronized和生产者消费者模型

    1.NSLock 线程锁, 任何两个线程访问同一共享资源(变量,数组)都需要加锁,保证同一时刻只能有一个线程访问共享资源 一个银行账户:有1000块钱,有两个线程同时做一次取钱操作,取钱的金额为800 ...

最新文章

  1. 失败的windows系统服务调用readfile():管道已结束?_操作系统之进程详解(一)
  2. 分计算iv值_S71200PLC模拟量编程方法与计算原理
  3. JAVA知识基础(六):抽象
  4. 详解苹果 macOS Mail 中的零点击漏洞
  5. 孙鑫MFC笔记之十五--进程间通信
  6. 主机网络切换后,docker toolbox里的容器网络不通了,解决方法
  7. 基于Linux的防火墙不安全
  8. 免费将pdf文件转换成word
  9. PHP 解压 ZIP 文件到指定文件夹
  10. NR的SSB子载波间隔讨论——为何无60kHz
  11. 内网渗透笔记——三层发现and四层发现
  12. 抖音的推荐算法是怎样的?
  13. Softing smartLink网关——推进过程工业数字化转型
  14. uniapp 二维码展示和扫码
  15. python 椭圆检测_使用OpenCV和Python检测触摸/重叠圆/椭圆
  16. 小学语文教学计算机的作用,浅谈多媒体信息技术在小学语文教学中的作用
  17. python——wxpy模块实现微信尬聊(基于图灵机器人)
  18. 没有伪装和欺骗才能活在当下
  19. hadoop 读取数据
  20. win2003 如何更换cd key?

热门文章

  1. Linux服务器,服务管理--systemctl命令详解,设置开机自启动
  2. InfluxDB-Python 操作实践
  3. LeetCode Assign Cookies
  4. mysql 命令行参数
  5. iOS开发日记46-倒计时效果的实现
  6. Codeigniter夸应用调用model
  7. docker和k8s发展史--理解oci/cri/cni/docker swarm/containerd/runc/dockershim
  8. (09)System Verilog 队列示例
  9. matlab吧结果存数组,求助:如何将带有符号变量的运算结果储存到数组中
  10. ieee期刊的科技写作思路曹文平_科技论文写作与发表教程(第六版)