下面是:2个并发进程、和2个并发线程的示意图:

下面介绍三种多线程技术(Thread、Cocoa Operation、Grand Central Dispatch):

1、最轻量级Thread(需要自己管理线程的生命周期和同步,所以不常用):线程同步对数据的加锁会导致一定的系统开销。但偶尔也会有一定的用处,如Thread.current可以获得当前线程,这种使用就很方便。

//下面是创建Thread的两种方法
//方法一:使用类方法,创建线程(创建好,就启动了)
Thread.detachNewThreadSelector(#selector(addOne), toTarget: self, with: nil)
//方法二:线程实例化,采用便利构造器
let thread2 = Thread(target: self, selector: #selector(addTwo), object: nil)
thread2.start()

2、Cocoa Operation(相关类Operation和OperationQueue):这种方法就不需要关心线程管理和数据同步,只需把重点放在多线程分别要执行的任务。

其中Operation是个抽象类,使用它必须用它的子类,可以自定义,也可以用BlockOperation类。要让Operation子类的对象,执行它的任务(方法),就需要把这个对象,add进入OperationQueue对象的操作队列,依次执行:
let blockOne = BlockOperation(block: addOne)
let blockTwo = BlockOperation(block: addTwo)
let queue = OperationQueue()
queue.addOperation(blockOne)
queue.addOperation(blockTwo)

3、Grand Central Dispatch(GCD):

GCD会自动合理地利用更多的CPU内核(即根据系统负载来自动增减线程数量,从而减少了上下文切换,而增加计算效率)、自动管理线程的生命周期(如创建线程、调度任务、自动同步,无需加锁、销毁线程等,使用就不用过多关心这些与处理事物无关的代码),所以方便的GCD是我们学习iOS多线程的重点。
使用GCD就是使用dispatch queue(调度队列)的对象,用来接受任务并执行,而且与以上两种方法不同的是,dispatch queue是可以并发的,也可以FIFO串行。

GCD有两种队列(串行、并行,一个队列对象就代表一个线程),用于存放任务,任务的执行也有两种同步、异步执行。具体如何执行,理解下图:

创建队列

主队列:主线程中的唯一队列,用于刷新UI(因为主线程主队列是唯一的,所以这种操作也是串行的),所以其他的耗时任务要放到其他线程的队列中执行。获得主队列:let mainQueue = DispatchQueue.main

自定义队列:

对于并行队列,有4个常用的执行优先级(由高到低):.userInitiated—>.default—>.utility—>.background,一般最后一个就用于执行不太关心、极其费时的后台任务。

  • 创建串行队列:let serial = DispatchQueue(label: "serialQueue"),一个串行队列之中,任务是FIFO的,但是可以创建多个串行队列,而串行队列之间是并发的。
  • 创建并行队列(对于并发任务,一般就用系统提供的全局并行队列):let conflict = DispatchQueue(label: "conflictQueue", qos: .default, attributes: .concurrent, autoreleaseFrequency: .inherit, target: nil)
  • 全局并行队列:let globalQueue = DispatchQueue.global(qos: .default),qos就是优先级。

然后就是创建任务了:

同步任务:在任务执行时,线程的队列会等待执行完成后,才执行下一个任务,但是却可以追加新的任务(虽然没有立即执行:阻塞)

        let globalQueue = DispatchQueue.global(qos: .default)
globalQueue.sync {
addOne()
}

异步任务:不会阻塞当前线程

        let globalQueue = DispatchQueue.global(qos: .default)
globalQueue.async {
self.addOne()
}
let mainQueue = DispatchQueue.main
mainQueue.async {
self.addTwo() //主线程先执行
}

iOS多线程主题的更多相关文章

  1. 浅谈iOS多线程

    浅谈iOS多线程 首先,先看看进程和线程的概念. 图1.1 这一块不难理解,重点点下他们的几个重要区别: 1,地址空间和资源:进程可以申请和拥有系统资源,线程不行.资源进程间相互独立,同一进程的各线程 ...

  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多线程开发

    概览 大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操 ...

随机推荐

  1. 从零开始编写自己的C#框架(16)——Web层后端父类

    本章节讲述的各个类是后端系统的核心之一,涉及到系统安全验证.操作日志记录.页面与按键权限控制.后端页面功能封装等内容,希望学习本系列的朋友认真查看新增的类与函数,这对以后使用本框架进行开发时非常重要. ...

  2. Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...

  3. iOS引入JavaScriptCore引擎框架(二)

    为何放弃第一种方案 UIWebView的JSContext获取     上篇中,我们通过简单的kvc获取UIWebVIew的JSContext,但是实际上,apple并未给开发者提供访问UIWebVi ...

  4. wordpress插件bug排查后记(记一次由于开启memecached引起的插件bug)

    这篇文章是写给自己的. 周三的时候我在维护公司的一个wordpress项目页面时发现了一个非常奇怪的情况:当我尝试更新网站上的一个页面后,在wordpress后台的编辑器中发现其内容并没有按我预期的将 ...

  5. 分页插件思想:pc加载更多功能和移动端下拉刷新加载数据

    感觉一个人玩lol也没意思了,玩会手机,看到这个下拉刷新功能就写了这个demo! 这个demo写的比较随意,咱不能当做插件使用,基本思想是没问题的,要用就自己封装吧! 直接上代码分析下吧! 布局: & ...

  6. 2.C#WinForm基础Email分析器

    功能:输入Email地址,输出用户名和域名 string[] String.split(params char[] separator)(+5重载)) 返回的字符串数组包含此实例的字符串(由指定Uni ...

  7. TCP四步挥手的各种状态转换图

    对于TCP四步挥手时的各种状态转换,网上有很多资料.但是有很多描述不是很容易理解,甚至是描述错误,不如这篇文章里http://www.cnblogs.com/Jessy/p/3535612.html# ...

  8. TCP初始化序列号ISN

    TCP初始化序列号ISN TCP初始化序列号不能设置为一个固定值,因为这样容易被攻击者猜出后续序列号,从而遭到攻击. RFC1948中提出了一个较好的初始化序列号ISN随机生成算法. ISN = M ...

  9. java基础练习 字符串,控制流,日历,日期等

    1,对基本控制流程的一些练习 package org.base.practice3; import org.junit.Test; /** * Created with IntelliJ IDEA. ...

  10. Swing布局管理器介绍

    创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://zhangjunhd.blog.51cto.com/113473/128174 当选 ...