iOS多线程笔记
在iOS开发中,有三种多线程处理方式:
1. 利用NSThread
2. NSOperation和NSOperationQueue
3. 利用GCD(Grand Central Dispatch)
使用上,从1到3是越来越简单,但是,对于1和2还是需要了解一下,了解本质有利于在出现一些bug时思考得更深入一些。
下面从1开始,记录使用流程:
1. NSThread

iOS和Android一样,只能在UI线程更新UI界面,如果在子线程需要更新UI控件,需要执行[self performSelctrorOnMainThread: withObject: waitUntilDone:]来进行更新操作。
第一次运行输出如下:

第二次运行输出如下:

可以看到,虽然启动了线程,但是不是一启动就进入执行状态,CPU会在线程之间切换执行,线程就会在运行、就绪状态间切换,如需调用start函数后(此时线程处于就绪态)马上切换到运行态,可在主线程调用此函数: [NSThread sleepForTimeInterval:0.001]让线程休眠一下,进入阻塞状态,然后等待CPU调度,如果想让线程有更多的运行机会,可以调整优先级,默认优先级为0.5:

结果如下:

在子线程出现如下情况会自行终止:
1. 线程逻辑函数处理完成
2. 线程执行中发生异常
3. 调用了[NSThread exit]
注意:主线程结束后,由主线程启动的子线程不会跟随终止,可以如下在UI线程终止子线程,利用发生cancle信号:
程序和运行结果如下:


这里设定500毫秒后发送终止子线程信号,子线程判断收到cancel信号后终止自己。
2. NSOperation与NSOperationQueue
NSOperationQueue是一个FIFO队列,负责管理系统提交的多个NSOperation。
NSOperation类型Java里的Runnable接口,代表一个多线程任务,它有NSInvocationOperation和NSBlockOperation两个子类(用于封装需要异步执行的任务),这两个子类可以直接使用,或者开发者可以自己继承NSOperation来实现自己的子类。
开发步骤:
1. 创建NSOperationQueue队列,设置其属性
2. 创建NSOperation子类的对象,然后将对象提交到NSOperationQueue队列,队列将按顺序依次启动每个NSOperaion。
示例:

可以看到,这里开启了两个线程来处理任务。
3. GCD
核心概念:
队列:在底层维护一个线程池,使用FIFO方式管理开发者提交的任务,有串行队列和并发队列
任务:开发者提交给队列的工作单元,这些任务会交由队列底层的线程池内执行
开发步骤:
1. 创建队列
2. 将任务提交给队列
示例:

这里创建了一个串行队列和一个并发队列并且都以异步方式提交任务。在输出中可以发现,在串行队列中,会先后执行代码块,而在并发队列中,会并发执行代码块。
另外,还有dispatch_once可以让代码只运行一次,通常用于单例模式,dispatch_apply可以让代码重复运行多次,这里就不进行测试了。
iOS多线程笔记的更多相关文章
- iOS 多线程学习笔记 —— GCD
本文复制.参考自文章:iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用 ,主要为了加强个人对知识的理解和记忆,不做他用.原作者声明: 著作权声明:本文由http:// ...
- iOS 多线程学习笔记 —— NSOperation
本文复制.参考自文章:iOS多线程编程之NSOperation和NSOperationQueue的使用 ,主要为了加强个人对知识的理解和记忆,不做他用.原作者声明: 著作权声明:本文由http://b ...
- iOS 多线程学习笔记 —— NSThread
本文复制.参考自文章:iOS多线程编程之NSThread的使用 ,主要为了加强个人对知识的理解和记忆,不做他用.原作者声明: 著作权声明:本文由http://blog.csdn.net/totogo ...
- iOS学习笔记-精华整理
iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...
- iOS学习笔记总结整理
来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...
- iOS学习笔记之ARC内存管理
iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其 ...
- 菜鸟手下的iOS开发笔记(swift)
在阳春4月的一天晨会上,有一个老板和蔼的对他的一个菜鸟手下说:“你既然会Android,那你能不能开发iOS?” 不是说好的要外包的吗?内心跌宕,但是表面淡定的菜鸟手下弱弱的回道:“可以试试”. 第二 ...
- IOS学习笔记48--一些常见的IOS知识点+面试题
IOS学习笔记48--一些常见的IOS知识点+面试题 1.堆和栈什么区别? 答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来说,释放工作由程序员控制,容易产生memor ...
- iOS学习笔记17-FMDB
上一节我已经介绍了SQLite的简单使用,不了解的可以提前去看一下iOS学习笔记16-数据库SQLite,这节我们来讲下FMDB. 一.FMDB介绍 FMDB是一种第三方的开源库,FMDB就是对SQL ...
随机推荐
- ionic 获取手机所在位置
之前项目中需要使用到定位功能,前边的文章提到的坐标位置是有问题的,是国际坐标,国内的环境使用google地图会出现问题,所以需要使用国内的地图进行坐标解析,因为国内和国外的坐标体系不一致,需要通过转换 ...
- NoSQL和MongoDB
NoSQL(NoSQL=Not Only SQL),意即“不仅仅是SQL”.关系数据库关注在关系上,NoSQL关注在存储上. 发展背景 (1)传统关系型数据库遇到了性能瓶颈. 高并发读写(High ...
- web前端基础知识-(七)Django进阶
通过上节课的学习,我们已经对Django有了简单的了解,现在来深入了解下~ 1. 路由系统 1.1 单一路由对应 url(r'^index$', views.index), 1.2 基于正则的路由 u ...
- Bubble Cup 8 finals F. Bulbo (575F)
题意: 给定初始位置,查询n次区间,每次查询前可以花费移动距离的代价来移动, 查询时需要花费当前位置到区间内最近的点的距离,求最小代价. 1<=n<=5000,1<=所有位置< ...
- 一起阅读《Java多线程编程核心技术》
目录 第一章 Java多线程技能 (待续...)
- HTML 内容居中方式总结
在HTML网页排版经常会用到关于对其方式的情况,水平居中和垂直居中.特别是水平居中,并不是一个简单的text-align就可以解决所有的情况. 开始之前普及一点HTML知识,目标很明显,不同的页面结构 ...
- 网络第三节——NSURLSession
有的程序员老了,还没听过NSURLSession有的程序员还嫩,没用过NSURLConnection有的程序员很单纯,他只知道AFN. NSURLConnection在iOS9被宣布弃用,NSURLS ...
- ObjC运行时部分概念解析(一)
转型iOS已经许久了,Runtime(运行时)还没有好好了解过.之前没有阅读过源码,紧紧凭借自己的臆测.现在阅读下源码,做一些笔记.方便再次翻阅 SEL SEL是一个关键字,如果没有涉及runtime ...
- C#在函数内部获取函数的参数
foreach (var parameter in typeof(类名).GetMethod("方法名").GetParameters()) { Console.WriteLine ...
- Java Native Interface 四--JNI中引用类型
本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 JNI支持将类实例和数组类型(如jobjec ...