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 ...
随机推荐
- django数据库操作和中间件
数据库配置 django的数据库相关表配置在models.py文件中,数据库的连接相关信息配置在settings.py中 models.py相关相关参数配置 from django.db import ...
- zookeeper原理解析-服务器端处理流程
1)处理器链 这部分内容我们主要讲解zookeeper请求在zookeeper server端的处理流程,对于不同角色的zookeeper具有不同的处理流程, ZookeepeerServer的sta ...
- Map集合及与Collection的区别、HashMap和HashTable的区别、Collections、
特点:将键映射到值的对象,一个映射不能包含重复的键,每个键最多只能映射到一个值. Map集合和Collection集合的区别 Map集合:成对出现 (情侣) ...
- 推荐一篇关于java 学习的文章,感觉写的很不错
---恢复内容开始--- 很多网友问我学习Java有没有什么捷径,我说"无他,唯手熟尔".但是我却很愿意将自己学习的一些经验写出来,以便后来者少走弯路,帮助别人是最大的快乐嘛 ...
- UML大战需求分析--阅读笔记3
这次阅读的是第四章,流程分析利器之 – 活动图.对需求有两种分析的方式:结构建模与行为建模.活动图是行为建模中经常使用的一种图.由流程图发展而来. 活动图中有一些名词:开始状态.结束状态.活动.判断. ...
- Webpack中hash与chunkhash的区别,以及js与css的hash指纹解耦方案
文件的hash指纹通常作为前端静态资源实现增量更新的方案之一,Webpack是目前最流行的开源编译工具之一,其强大的功能也带来很多坑(当然,大部分麻烦其实都可以在官方文档中找到答案). 比如,在Web ...
- 逐行扫描型Memory LCD显存管理与emWin移植
因为Memory LCD 的特性,不能设置像素坐标,只能用缓存整体刷新. 所以对于Memory LCD来说,emWin移植仅与打点函数有关,这里用Sharp Memory LCD(ls013b7dh0 ...
- hibernate+mysql的连接池配置
1:连接池的必知概念 首先,我们还是老套的讲讲连接池的基本概念,概念理解清楚了,我们也知道后面是怎么回事了. 以前我们程序连接数据库的时候,每一次连接数据库都要一个连接,用完后再释放.如果频繁的 ...
- 关于在Xcode控制台打印的注意点
注意!!在控制台中打印语句的返回值,这句代码也算是被执行过了一次 比如在下列代码的if语句执行之前,现在控制台打印 [_dataBaseexecuteUpdate:createSql] 的布尔值 if ...
- WCF学习第二篇:WCF 配置架构。这有助于对wcf配置的理解和记忆
使用 Windows Communication Foundation (WCF) 配置元素,您可以配置 WCF 服务和客户端应用程序. 可以使用配置编辑器工具 (SvcConfigEditor.ex ...