(swift) iOS线程二 ——Operation和OperationQueue简单用法
来源:互联网 发布:狸窝视频剪辑软件 编辑:程序博客网 时间:2024/05/29 14:18
swift学习
二、Operation和OperationQueue简单用法
首先还是先查看一下这两个class的开发说明:
(开发说明中NSOperation的一些链接已经取消了,已经被替换为Operation,以下就引用“Operation”或者“操作”来说明)这里说,Operation是一个抽象类,可以用来封装一个任务,其中包含代码逻辑和数据。因为Operation是抽象类,所以编写代码时不能直接使用,要使用它的子类,系统默认提供的有NSInvocationOperation(新版本中已经取消)和BlockOperation。虽然Operation是抽象类,但是实现任务安全执行的逻辑已经实现,在使用的时候你只需要关注你任务中逻辑处理。
一些常用的函数和属性:
func start() 启动这个操作
func main() 这个函数描述的是这个操作要处理的事务
var completionBlock: (() -> Void)? 操作完成后做什么
来看看BlockOperation,根据单次字面意思“闭包操作”容易理解这个类主要处理内容是闭包。来看提供的接口
//
// ViewController.swift
// OperationLearn
//
// Created by QinJeoy on 2016/10/22.
// Copyright © 2016年 QinJeoy. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
var operation = BlockOperation{
for i in 0…5 {
print(“operation 1 — (i)”)
}
}
var operation2 = BlockOperation()
override func viewDidLoad() { super.viewDidLoad() operation.start() operation2.addExecutionBlock { for i in 0...5 { print("operation2 - 1 --- \(i)") } } operation2.addExecutionBlock { for i in 0...5 { print("operation2 - 2 --- \(i)") } } operation2.start() print("operation -- start/end!")}override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated.}
}
运行结果
冲输出的记过来看,operation的执行是在当前线程中的没有新线程参与。还有要注意的是操作是一次性的。
(新版本好像去掉了很多NS,用惯java了这样看着顺眼多了–!)这里说,OperationQueue(操作队列)是用来控制一系列操作对象执行的。操作对象被添加进队列后,一直存在到操作被取消或者执行完成(这么看来操作是一次性的)。队列里的操作对象(这里指的是没有执行的)执行的顺序有操作的优先级和操作之间的依赖决定。一个应用里可以创建多个队列进行操作处理。
然后来了解下相关的属性和函数
来看看func addOperations([Operation], waitUntilFinished: Bool)第二个参数的作用
waitUntilFinished为true是将阻塞当前线程知道将添加的操作执行完成,false择不阻塞,说白了就是同步跟异步的控制吧。
然后看看上面最后一个函数 func waitUntilAllOperationsAreFinished()这个函数的作用也是阻塞当前线程等待队列操作执行完成。既然单独提供了这个函数,是不是就可以理解队列执行操作本身是异步的呢?
现在修改代码
//
// ViewController.swift
// OperationLearn
//
// Created by QinJeoy on 2016/10/22.
// Copyright © 2016年 QinJeoy. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
var operationqueue = OperationQueue()
var operation = BlockOperation{ for i in 0...20 { Thread.sleep(forTimeInterval: 0.1) print("operation 1 --- \(i)") }}var operation2 = BlockOperation()override func viewDidLoad() { super.viewDidLoad()// operation.start() operation2.addExecutionBlock { for i in 0...20 { Thread.sleep(forTimeInterval: 0.1) print("operation2 - 1 --- \(i)") } } operation2.addExecutionBlock { for i in 0...20 { Thread.sleep(forTimeInterval: 0.1) print("operation2 - 2 --- \(i)") } } // operation2.start() operationqueue.addOperation(operation); operationqueue.addOperation(operation2); print("operation -- start/end!")}override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated.}
}
运行结果:
可以看出现在运行时异步的,而且操作好像是并发的。现在修改代码让operation先执行完再执行operation2.
将
operationqueue.addOperation(operation);operationqueue.addOperation(operation2);print("operation -- start/end!")
修改为
operationqueue.addOperation(operation);operationqueue.waitUntilAllOperationsAreFinished()operationqueue.addOperation(operation2);print("operation -- start/end!")
运行结果:
自定义Operation:
实现Operation的子类
class JTask: Operation { override func main() { for i in 0...20 { Thread.sleep(forTimeInterval: 0.1) print("JTask print --- \(i)") } }}//使用operationqueue.addOperation(JTask())
从上的实验来看,使用队列操作可以并发,但是没操作结束怎么去处理,比如说一个下载操作完成后我们希望得到通知或者回调,那就要用到Operation的这个属性 var completionBlock: (() -> Void)? 这是一个闭包。
OperationQueue处理任务是并发的,可以使用
来指定队列并发操作的最大限制,默认值是-1,这个有兴趣可以实验。
- (swift) iOS线程二 ——Operation和OperationQueue简单用法
- (swift) iOS线程一 ——Thread接口简单用法
- iOS开发之多线程技术(NSThread、OperationQueue、GCD)
- iOS开发之多线程技术(NSThread、OperationQueue、GCD)
- iOS 多线程开发之OperationQueue(二)NSOperation VS GCD
- iOS 多线程开发之OperationQueue(一)概念+两种Operation
- iOS开发Swift篇—(二)变量和常量
- iOS内存优化——OperationQueue悄悄给你挖的坑
- iOS 开发,用 NSInvocationOperation 和 OperationQueue 做多线程操作
- iOS开发Swift篇—简单介绍
- iOS开发Swift篇—简单介绍
- swift 实例演示 Operation 的用法
- swift详解之二十三------------UICollectionView基础用法和简单自定义
- IOS-Swift的对象和类(基础二)
- iOS项目之Swift新闻App(二)—网络数据请求和添加TableHeader
- Swift和Objective-C的API交互—Swift学习笔记(二十)
- iOS开发Swift篇—(三)字符串和数据类型
- iOS开发(Swift)——Swift和OC的互用
- 自定义圆形图片
- java的继承 inheritance
- Android 6.0 运行时权限处理
- 杭电2175
- ViewPager和SlidingPaneLayout的滑动冲突事件
- (swift) iOS线程二 ——Operation和OperationQueue简单用法
- 2016京东算法工程师实习生笔试编程题:小球的距离
- 基本的一些算法
- Struts2(1)——总体概述
- Linux动态链接库的建立与使用
- 设计模式之 单例模式
- POJ2528
- 线性表的链式存储结构
- getSystemService()介绍