iOS开发:Swift多线程NSOperation的使用
介绍:
NSOperation是基于GCD实现,封装了一些更为简单实用的功能,因为GCD的线程生命周期是自动管理,所以NSOperation也是自动管理。NSOperation配合NSOperationQueue也可以实现多线程。
实现步骤
第1步:将一个操作封装到NSOperation对象中
第2步:将NSOperation对象放入NSOperationQueue队列
第3步:NSOperationQueue自动取出队列中的NSOperation对象放到一条线程中执行
具体实现
在swift中的实现方式分2种(oc还多了一个NSInvocationOperation,并且在oc中NSOperation是个抽象类):
1.NSBlockOperation
2.自定义子类继承NSOperation
目录:
1.NSOoperation常用操作,创建队列,设置最大并发数。
//创建队列
let queue = NSOperationQueue()
//设置最大并发数
queue.maxConcurrentOperationCount= //创建operation
let operation = NSBlockOperation { () -> Void in
print("doSomething1 \(NSThread.currentThread())")
} //当operation有多个任务的时候会自动分配多个线程并发执行,
//如果只有一个任务,会自动在主线程同步执行
//operation.start() operation.addExecutionBlock { () -> Void in
print("doSomething2 \(NSThread.currentThread())")
} operation.addExecutionBlock { () -> Void in
print("doSomething3 \(NSThread.currentThread())")
} let operation2=NSBlockOperation { () -> Void in
print("doSomething4 \(NSThread.currentThread())")
} //添加到队列中的operation将自动异步执行
queue.addOperation(operation)
queue.addOperation(operation2) //还有一种方式,直接将operation的blcok直接加入到队列
queue.addOperationWithBlock { () -> Void in
print("doSomething5 block \(NSThread.currentThread())")
}
queue.addOperationWithBlock { () -> Void in
print("doSomething6 block \(NSThread.currentThread())")
}
queue.addOperationWithBlock { () -> Void in
print("doSomething7 block \(NSThread.currentThread())")
}
queue.addOperationWithBlock { () -> Void in
print("doSomething8 block \(NSThread.currentThread())")
}
2.NSOperation操作依赖,可设置一个操作在另一个操作完成后在执行
//创建队列
let queue = NSOperationQueue() let operationA = NSBlockOperation { () -> Void in
print("print A")
}
let operationB = NSBlockOperation { () -> Void in
print("print B")
}
let operationC = NSBlockOperation { () -> Void in
print("print C")
} //B等A执行完才执行
operationB.addDependency(operationA)
//C等B执行完才执行
operationC.addDependency(operationB) queue.addOperation(operationA)
queue.addOperation(operationB)
queue.addOperation(operationC)
3.NSOperation操作监听,一个操作完成后调用另一个操作:
func operationCompletion(){
//创建队列
let queue = NSOperationQueue()
let operation = NSBlockOperation { () -> Void in
print("print A")
}
operation.completionBlock = doSomething
queue.addOperation(operation)
}
func doSomething(){
print("doSomething")
}
4.NSOperation线程通信,NSOperationQueue.mainQueue。
//创建队列
let queue = NSOperationQueue()
queue.addOperationWithBlock { () -> Void in
print("子线程 \(NSThread.currentThread())")
NSOperationQueue.mainQueue().addOperationWithBlock({ () -> Void in
print("主线程 \(NSThread.currentThread())")
})
}
注意:
1.在使用队列任务的时候,内存警告的时候可使用队列的cancelAllOperations函数取消所有操作,注意一旦取消不可恢复。亦可设置队列的suspended属性暂停和恢复队列。
2.在设置操作依赖的时候不能设置循环依赖。
完!
iOS开发:Swift多线程NSOperation的使用的更多相关文章
- iOS开发之多线程(NSThread、NSOperation、GCD)
整理一些多线程相关的知识. 并行 & 并发 1.并行:并行是相对于多核而言的,几个任务同时执行.2.并发:并发是相对于单核而言的,几个任务之间快速切换运行,看起来像是"同时" ...
- iOS开发之多线程技术
本篇争取一篇讲清讲透,依然将通过四大方面清晰的对iOS开发中多线程的用法进行详尽的讲解: 一.什么是多线程 1)多线程执行原理 2)线程与进程 3)多线程的优缺点 二.我们为什么要用多线程编程技术 三 ...
- iOS开发Swift篇(02) NSThread线程相关简单说明
iOS开发Swift篇(02) NSThread线程相关简单说明 一 说明 1)关于多线程部分的理论知识和OC实现,在之前的博文中已经写明,所以这里不再说明. 2)该文仅仅简单讲解NSThread在s ...
- 李洪强iOS开发Swift篇---12_NSThread线程相关简单说明
李洪强iOS开发Swift篇---12_NSThread线程相关简单说明 一 说明 1)关于多线程部分的理论知识和OC实现,在之前的博文中已经写明,所以这里不再说明. 2)该文仅仅简单讲解NSThre ...
- iOS开发-多线程编程技术(Thread、Cocoa operations、GCD)
简介 在软件开发中,多线程编程技术被广泛应用,相信多线程任务对我们来说已经不再陌生了.有了多线程技术,我们可以同做多个事情,而不是一个一个任务地进行.比如:前端和后台作交互.大任务(需要耗费一定的时间 ...
- ios开发之多线程---GCD
一:基本概念 1:进程:正在运行的程序为进程. 2:线程:每个进程要想执行任务必须得有线程,进程中任务的执行都是在线程中. 3:线程的串行:一条线程里任务的执行都是串行的,假如有一个进程开辟了一条线程 ...
- iOS开发Swift篇—(一)简单介绍
iOS开发Swift篇—简单介绍 一.简介 Swift是苹果于2014年WWDC(苹果开发者大会)发布的全新编程语言 Swift在天朝译为“雨燕”,是它的LOGO 是一只燕子,跟Objective-C ...
- iOS开发Swift篇—(二)变量和常量
iOS开发Swift篇—(二)变量和常量 一.语言的性能 (1)根据WWDC的展示 在进行复杂对象排序时Objective-C的性能是Python的2.8倍,Swift的性能是Python的3.9倍 ...
- iOS开发Swift篇—(三)字符串和数据类型
iOS开发Swift篇—(三)字符串和数据类型 一.字符串 字符串是String类型的数据,用双引号""包住文字内容 let website = "http://www ...
- iOS开发Swift篇—(四)运算符
iOS开发Swift篇—(四)运算符 一.运算符 1.Swift所支持的部分运算符有以下一些 赋值运算符:= 复合赋值运算符:+=.-= 算术运算符:+.-.*./ 求余运算符:% 自增.自减运算符: ...
随机推荐
- C语言基础:指针类型与指针和数组、字符串的关系
//指针变量就是用来存储地址的,只能存储地址 格式: int *p; 这个p为指针变量:指针变量占8个字节 类型是用来说明这个指针指向的类型: 比如上边的int代表这个指针变量会指向int类型的 ...
- 中国IT人,你们是否从没想过开发一款伟大的产品?
我也是今年刚毕业的,一毕业就做了猎头,从开始实习到正式工作,迄今为止接触的IT技术人不下上千人了.这里面有腾讯.阿里巴巴.百度.360.金山.金蝶.用友.华为.惠普等从事自主研发的大牛,也有很多软通. ...
- Careercup - Facebook面试题 - 23869663
2014-05-02 03:37 题目链接 原题: A string is called sstring if it consists of lowercase english letters and ...
- [原创] zabbix学习之旅三:agent安装
部署完zabbix server后,自然要部署zabbix agent.在官方描述中,agent是部署在被监控的机器上,用于采集CPU.内存.磁盘等统计信息,并上报给server用于进一步处理.age ...
- QT for android 比较完美解决 全屏问题
项目用到QT qml,需要在android下面全屏显示,折腾了一晚上,搞定,分享下,希望能帮助他人. 参考 Qt on Android:让 Qt Widgets 和 Qt Quick 应用全屏显示 该 ...
- [设计模式] 21 策略模式 Strategy
在GOF的<设计模式:可复用面向对象软件的基础>一书中对策略模式是这样说的:定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.该模式使得算法可独立于使用它的客户而变化. 策略模 ...
- mysql_fetch_row,mysql_fetch_array,mysql_fetch_object,mysql_fetch_assoc区别
1.mysql_fetch_row 只能以索引下标取值,从0开始. 2.mysql_fetch_array 能以索引下标取值,也可以用字段名称取值. 3.mysql_fetch_object 对象方 ...
- POJ1144 Network 无向图的割顶
现在打算重新学习图论的一些基础算法,包括像桥,割顶,双连通分量,强连通分量这些基础算法我都打算重敲一次,因为这些量都是可以用tarjan的算法求得的,这次的割顶算是对tarjan的那一类算法的理解的再 ...
- 在实体注解OneToMany时,要加上mappedby,避免产生中间表。
在实体注解OneToMany时,要加上mappedby,避免产生中间表.
- http://jingyan.baidu.com/article/08b6a591f0fafc14a9092275.html
http://jingyan.baidu.com/article/08b6a591f0fafc14a9092275.html http://jingyan.baidu.com/article/414e ...