文档章节

NSOperation和NSOperationQueue

iossocket
 iossocket
发布于 2015/06/22 08:24
字数 869
阅读 52
收藏 0

介绍    

    NSOperation和NSOperationQueue是苹果对GCD做了一层封装,使得的使用更加简便,首先来看一个简单的使用方法,这里使用了Swift语言进行说明:

let operation: NSBlockOperation = NSBlockOperation(block: {() -> Void in // 1
    let data: NSData = NSData(contentsOfURL: NSURL(string: "http://f8.topit.me/8/ed/67/110248312730a67ed8o.jpg")!)!
    dispatch_async(dispatch_get_main_queue(), {() -> Void in // 2
        self.imageView1.image = UIImage(data: data)
    })
})
NSOperationQueue().addOperation(operation) // 3

1.  创建了一个NSBlockOperation的实例,在构造方法中将需要完成的任务以闭包的方式封装在里面。

2. 由于需要更新UI,在这里先用GCD的方式来更新

3. 创建一个匿名NSOperationQueue,并通过addOperation方法,将刚刚创建的实例添加入队列,此时该任务开始执行。

关于NSOperationQueue的说明:公用两种类型的队列,其一为main queue,另一种为custom queue。

创建NSOperation有两种方法,一种是使用系统为我们提供的NSOperation的子类(NSBlockOperation),另一种是自定义继承自NSOperation的类。

NSBlockOperation相关方法

start方法,通过operation.start()进行调用,使用这个方法后,就无需通过NSOperationQueue进行添加。operation内的任务会直接开始执行,当时此方法是一个同步方法,它将阻塞主线程。

cancel方法,通过operation.cancel()进行调用,看方法名便可知道它将取消该operation。

completionBlock方法,它会在任务完成之后进行调用。看如下代码示例:

let operation: NSBlockOperation = NSBlockOperation(block: {() -> Void in
    let data: NSData = NSData(contentsOfURL: NSURL(string: "http://f8.topit.me/8/ed/67/110248312730a67ed8o.jpg")!)!
    dispatch_async(dispatch_get_main_queue(), {() -> Void in
        self.imageView1.image = UIImage(data: data)
    })
})

NSOperationQueue().addOperation(operation)
operation.completionBlock = {() -> Void in
    println("completed!")
}

需要将一个闭包赋值给该属性,当任务完成后,该闭包内的代码将被执行。

addExecutionBlock方法,通过此方法可将一个新的任务添加到operation中,并且添加后的会并发执行。

let operation: NSBlockOperation = NSBlockOperation(block: {() -> Void in
    let data: NSData = NSData(contentsOfURL: NSURL(string: "http://f8.topit.me/8/ed/67/110248312730a67ed8o.jpg")!)!
    dispatch_async(dispatch_get_main_queue(), {() -> Void in
        self.imageView1.image = UIImage(data: data)
    })
})
        
operation.addExecutionBlock({() -> Void in
    let data: NSData = NSData(contentsOfURL: NSURL(string: "http://www.33lc.com/article/UploadPic/2012-10/2012102416202559471.jpg")!)!
    dispatch_async(dispatch_get_main_queue(), {() -> Void in
        self.imageView2.image = UIImage(data: data)
    })
})

NSOperationQueue().addOperation(operation)
operation.completionBlock = {() -> Void in
    println("completed!")
}


自定义NSOperation的子类

先看一个简单的例子,创建一个类,继承自NSOperation。

import UIKit

protocol opCompletionDelegate {
    func opCompletion(data: NSData)
}

class MyOperation: NSOperation {
   
    var delegate: opCompletionDelegate?
    
    override func main() {
        super.main()
        
        let data: NSData = NSData(contentsOfURL: NSURL(string: "http://f8.topit.me/8/ed/67/110248312730a67ed8o.jpg")!)!
        
        dispatch_async(dispatch_get_main_queue(), {() -> Void in
            
            if let myDelegate = self.delegate {
                myDelegate.opCompletion(data)
            }
        })
    }
}

在ViewController中,调用如下所示:

var myOperation: MyOperation = MyOperation()
        
// set delegate
myOperation.delegate = self
        
NSOperationQueue().addOperation(myOperation)
并且此ViewController实现了 opCompletionDelegate协议。

func opCompletion(data: NSData) {
    self.imageView1.image = UIImage(data: data)
}


Operation间的依赖关系

可以使用addDependency方法来设置在同一个队列中的operation执行先后顺序。先来看一下下面这段代码:


let operation1: NSBlockOperation = NSBlockOperation(block: {() -> Void in
    println(1)
    let data: NSData = NSData(contentsOfURL: NSURL(string: "http://f8.topit.me/8/ed/67/110248312730a67ed8o.jpg")!)!
    dispatch_async(dispatch_get_main_queue(), {() -> Void in
        println(2)
        self.imageView1.image = UIImage(data: data)
    })
})
        
let operation2: NSBlockOperation = NSBlockOperation(block: {() -> Void in
    println(3)
    let data: NSData = NSData(contentsOfURL: NSURL(string: "http://www.33lc.com/article/UploadPic/2012-10/2012102416202559471.jpg")!)!
    dispatch_async(dispatch_get_main_queue(), {() -> Void in
        println(4)
        self.imageView2.image = UIImage(data: data)
    })
})
// 需要operation2完成后,operation1才开始执行
operation1.addDependency(operation2)
let myOperationQueue = NSOperationQueue()
myOperationQueue.addOperation(operation1)
myOperationQueue.addOperation(operation2)



其中的operation1.addDependency(operation2)指定了operation1需要在operation2执行结束之后才会被执行。因此在控制台打印的结果为:

队列最大执行operation的数量maxConcurrentOperationCount

NSOperationQueue具有一个maxConcurrentOperationCount熟悉,设置改熟悉可以控制该队列同时可并发执行的最大任务数,当设置为1时,此队列为一个串行队列。






© 著作权归作者所有

共有 人打赏支持
iossocket
粉丝 4
博文 19
码字总数 8603
作品 0
西安
程序员
私信 提问
iOS之[多线程:NSOperation]

NSOperation :fa-exclamation-triangle:以下是你需要考虑使用 NSOperation 的一些理由: 1.当你需要取消线程任务时,GCD 无法提供取消任务的操作。而 NSOperation 提供了取消任务的操作; 2.当...

言筱羽
2015/11/23
95
0
iOS多线程之NSOperation

1.简介 1.1NSOperation的作用 配合使用NSOperation和NSOperationQueue也能实现多线程编程 1.2NSOperation和NSOperationQueue实现多线程的具体步骤 先将需要执行的操作封装到一个NSOperation...

JlongTian
2016/01/10
33
0
【iOS】多线程NSOperation

NSOperation是苹果封装的一套多线程的东西,不像GCD是纯C语言的,这个是OC的。但相比较之下GCD会更快一些,但本质上NSOPeration是多GDC的封装。 一、NSOperation与GCD的比较 GCD是基于c的底层...

xn4545945
2014/07/28
0
0
NSOperationQueue

NSOperation的作用配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤先将需要执行的操作封装到一个NSOperation对象中然后将NSO...

5vinsEnt
2016/05/25
10
0
iOS多线程:『NSOperation、NSOperationQueue』详尽总结

iOS多线程:『NSOperation、NSOperationQueue』详尽总结 转载: 原地址https://www.jianshu.com/p/4b1d77054b35 本文首发于我的个人博客:『不羁阁』 文章链接:传送门 本文更新时间:2018年0...

法斗斗
2018/04/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周日乱弹 —— 没时间 没头发 但有钱

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @开源中国总经办主任 :分享齐一的单曲《这个年纪》 《这个年纪》- 齐一 手机党少年们想听歌,请使劲儿戳(这里) @肿肿卷 :我真的可以睡一天...

小小编辑
13分钟前
0
0
Django进阶 1.1 ORM基础—ORM 1.2.1 增删改查之查询 1.2.2 删改增 (1) 1.2.3 删改增 (2)

ORM基础 ORM是Django操作数据库的API,Django的作者将sql语句封装在里面供我们使用。 我们前面还提到过Django提供一个模拟数据库的工具,sqlite,供我们学习测试使用。 如果我们想使用mysql...

隐匿的蚂蚁
今天
1
0
Windows 上安装 Scala

在安装 Scala 之前需要先安装 Java 环境,具体安装的详细方法就不在这里描述了。 您可以自行搜索我们网站中的内容获得其他网站的帮助来获得如何安装 Java 环境的方法。 接下来,我们可以从 ...

honeymose
今天
3
0
数据库篇多表操作

第1章 多表操作 实际开发中,一个项目通常需要很多张表才能完成。例如:一个商城项目就需要分类表(category)、商品表(products)、订单表(orders)等多张表。且这些表的数据之间存在一定的关系...

stars永恒
今天
3
0
nginx日志自动切割

1.日志配置(Nginx 日志) access.log----记录哪些用户,哪些页面以及用户浏览器,IP等访问信息;error.log------记录服务器错误的日志 #配置日志存储路径:location / {      a...

em_aaron
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部