这篇主要总结下iOS开发中多线程的使用,多线程开发一般使用NSThread、NSOperation及GCD三种方式,常用GCD及NSOperation。

1.NSThread

创建线程主要有以下三种方式

需要注意的是对于多个线程可能同时访问一个对象的时候,使用“@synchronized”来解决这类线程同步问题。

在子线程中通知主线程通常使用以下两种办法:

2.NSOperation

NSOperation有三种使用方式,分别是NSInvocationOperation、NSBlockOperation以及自定义NSOperation操作,并可对NSOperation设置依赖关系,进而确定任务执行的先后顺序,还可以对任务的状态进行监控甚至控制,以及设置线程最大并发数量等等。

(1)NSInvocationOperation

首先是NSInvocationOperation方式创建线程如图所示,需要注意的是这种方式创建的操作只有加入到队列去执行才是异步操作,否则还是在主线程同步执行

加入到队列自动执行时,会新建线程异步执行

(2)NSBlockOperation

第二种则是使用NSBlockOperation,同样需要注意的是当操作的任务数只有一个时,任务会在当前线程同步执行

当任务数大于1的时候,会开启新线程并异步执行

当把NSBlockOperation定义的操作加入到队列中时,会以异步并发的方式去执行这些任务

(3)继承NSOperation,自定义Operation

这种方法较为灵活,通过继承NSOperation并重写相关方法实现,例如SDWebImage就用到了这种方式。

     (4)设置依赖

如果任务之间有先后顺序依赖,可以对他们设置依赖关系解决这个问题,如图所示,operation1依赖operation2,而operation2又依赖于operation3,于是执行顺序为operation3、operation2、operation1

     (5)设置任务最大并发数

可以通过设置maxConcurrentOperationCount限定任务并发数量,避免并发操作消耗太多资源

    (6)任务状态的监控以及设置

可以获取到任务的执行状态,是否执行中还是取消了或者完成了等等

需要注意的是,发送取消任务的消息,任务并不一定就真的取消,因为加入到队列以后,任务的执行都是由系统来管理了,取消成功的前提是任务还没有开始执行,即使该任务成功取消了,也还是会被系统认定为任务已经完成finished,所以如果有其他任务依赖于已经被取消的任务,需要用“isCancelled”进行判断,尤其是任务完成回调事件里做一些操作的话,可能说的有点绕,详细见下图:

如果不进行判断,即使operation3已经取消了,由于系统认为取消的任务也算finished,所以operation3的任务完成回调事件仍然触发

更详细的可以参考Concurrency Programming Guide中这部分的内容

当然,还可以直接对整个列进行管理,包括挂起或恢复队列中所有任务,取消队列里所有任务等等

3.GCD

GCD的使用主要有以下几种方式:

(1)在主线程中添加任务,dispatch_async异步方式执行,常见使用场景是进入以后,异步加载相关图片信息

(2)GCD中解决线程同步的问题可以使用串行队列,串行队列里任务会按照添加顺序依次执行,需要注意的是以distpatch_sync同步方式执行任务,所有任务都是在主线程进行的

(3)在串行队列中以dispatch_async异步方式执行任务,则系统开启一个新线程执行任务

(4)在并发队列中,以dispatch_async异步方式执行任务,则系统会根据任务数量建立一定数量的线程来执行任务,注意这里用的是全局并发队列。

(5)GCD方式执行延时任务

上图为回到主线程执行延时任务,下图为开启新的线程执行延时任务

(6)队列组

当需要同时执行多个任务,例如同时下载多张图片,并对图片进行处理显示这样类似的应用场景时,可以通过队列组的方式并发执行任务,提高效率,使用方式如图

(7)解决线程同步的问题除了使用串行队列外,还可以使用信号量来解决,详细参考Concurrency Programming Guide,另外需要注意的是以下两个使用方式会产生问题

一个是在主线程以dispatch_sync同步方式执行任务会死锁

另一个是在并行队列中以dispatch_sync同步方式执行任务,会失去并发的意义,最终所有任务都还是在主线程中一个一个执行

4.总结

一般情况用NSOperation和GCD可以满足应用需求,GCD方式使用起来已经足够简洁,而NSOperation使用起来则更加灵活方便,可以监听任务执行状态,取消任务,设置任务最大并发数量等等。

iOS开发笔记5:多线程之NSThread、NSOperation及GCD的更多相关文章

  1. 菜鸟手下的iOS开发笔记(swift)

    在阳春4月的一天晨会上,有一个老板和蔼的对他的一个菜鸟手下说:“你既然会Android,那你能不能开发iOS?” 不是说好的要外包的吗?内心跌宕,但是表面淡定的菜鸟手下弱弱的回道:“可以试试”. 第二 ...

  2. 多线程之NSThread

    关于多线程会有一系列如下:多线程之概念解析 多线程之pthread, NSThread, NSOperation, GCD 多线程之NSThread 多线程之NSOperation 多线程之GCD一, ...

  3. iOS开发Swift篇(02) NSThread线程相关简单说明

    iOS开发Swift篇(02) NSThread线程相关简单说明 一 说明 1)关于多线程部分的理论知识和OC实现,在之前的博文中已经写明,所以这里不再说明. 2)该文仅仅简单讲解NSThread在s ...

  4. iOS开发笔记7:Text、UI交互细节、两个动画效果等

    Text主要总结UILabel.UITextField.UITextView.UIMenuController以及UIWebView/WKWebView相关的一些问题. UI细节主要总结界面交互开发中 ...

  5. iOS开发笔记-两种单例模式的写法

    iOS开发笔记-两种单例模式的写法   单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h" ...

  6. iOS开发笔记--什么时候调用layoutSubviews

    iOS开发笔记--什么时候调用layoutSubviews 分类: iOS2014-04-22 16:15 610人阅读 评论(0) 收藏 举报 今天在写程序时候遇见layoutSubviews触发时 ...

  7. IOS开发笔记(4)数据离线缓存与读取

    IOS开发笔记(4)数据离线缓存与读取 分类: IOS学习2012-12-06 16:30 7082人阅读 评论(0) 收藏 举报 iosiOSIOS 方法一:一般将服务器第一次返回的数据保存在沙盒里 ...

  8. IOS开发笔记 IOS如何访问通讯录

    IOS开发笔记  IOS如何访问通讯录 其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的. 幸好ios6.0 以后给了个权限控制.当打开app的时候你可以选择拒绝. 实现方法: [plain] ...

  9. 【Swift】iOS开发笔记(二)

    前言 这个系列主要是一些开发中遇到的坑记录分享,有助于初学者跨过这些坑,攒够 7 条发一篇. 声明  欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯 ...

随机推荐

  1. ASP.NET MVC3 在_ViewStart設定Layout後用RenderAction的注意事項

    ASP.NET MVC3 在_ViewStart設定Layout後用RenderAction的注意事項 3/24 TW MVC第一次活動圓滿的結束了,雖然是RC,但也來了不少願意聽我們分享的好朋友. ...

  2. JavaScript之旅(二)

    JavaScript之旅(二) 二.进阶知识 js的正则表达式 异常处理 调试 变量提升 表单验证 JSON javascript:void(0) JavaScript 代码规范 二.进阶知识 1. ...

  3. 前端引擎初步设计稿 -通过配置生成动态页面 ,LandaSugar平台 .NET-C#-MVC

    公司准备开发出一款项目开发平台 LandaSugar,分为 前端引擎.工作引擎.数据引擎 三大块,开发人员只需要对三大模块进行相应的配置便能够完成一个定制项目的开发. 听起来貌似是异想天开,但是是否真 ...

  4. 关于解决JQUERY对INPUT元素Change事件不兼容的问题

    最近开发一个项目,需要实现用户在WEB表单里的多个INPUT框中输入数量后,立即自动计算加总各项输入的数量之和,并显示在指定的INPUT框中,这个功能实现的原理是简单的,就是只需要在INPUT的onc ...

  5. 使用saripaar对android输入控件进行快速验证

    saripaar是个android的第三方快速校验,使用注解快速添加验证规则. public class LoginActivity extends Activity implements Valid ...

  6. UVA题目分类

    题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...

  7. C#中国象棋+游戏大厅 服务器 + 客户端源码

    来源:www.ajerp.com/bbs C#中国象棋+游戏大厅 服务器 + 客户端源码 源码开源 C#版中国象棋(附游戏大厅) 基于前人大虾的修改版 主要用委托实现 服务器支持在线人数,大厅桌数的设 ...

  8. Linq专题之集合初始化器

    集合初始化器用来初始化一个集合,和对象初始化器有点类似,都是用一对{}来初始化. using System; using System.Collections.Generic; using Syste ...

  9. 使用事务操作SQLite数据批量插入,提高数据批量写入速度,源码讲解

    SQLite数据库作为一般单机版软件的数据库,是非常优秀的,我目前单机版的软件产品线基本上全部替换Access作为优选的数据库了,在开发过程中,有时候需要批量写入数据的情况,发现传统的插入数据模式非常 ...

  10. 学习笔记(一)——MVC扩展

    1.视图引擎的作用,总结为两点: 查找视图 渲染视图 ViewEngine即视图引擎, 在ASP.NET MVC中将ViewEngine的作用抽象成了 IViewEngine 接口. 默认情况下,AS ...