文档章节

NSOperation和NSOperationQueue

iossocket
 iossocket
发布于 2015/06/22 08:24
字数 869
阅读 51
收藏 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

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

JlongTian
2016/01/10
33
0
iOS之[多线程:NSOperation]

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

言筱羽
2015/11/23
95
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 OS X 和 iOS 中的多线程技术-4 (NSOperation)

//联系人:石虎QQ:1224614774昵称:嗡嘛呢叭咪哄 一NSOperation: 1.NSOperation做的事情比 NSThread 更多一些。通过继承 NSOperation,可以使子类获得一些线程相关的特性,进而可以安全地管理线...

石虎132
2017/12/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Windows 10 设置 Java 环境变量

首先你需要在我的电脑中打开,找到环境变量属性。 找到环境变量属性 找到环境变量属性后单击将会看到下面的设置界面。 在这个界面中设置高级系统设置。 环境变量 在弹出的界面中选择设置环境...

honeymose
16分钟前
1
0
用any-loader封装jQuery的XHR —— 随便写着玩系列

哎,都说没人用JQuery啦,叫你别写这个。 其实我也是好高骛远使用过npm上某个和某个很出名的XHR库,嗯,认识我的人都知道我喜欢喷JQ,以前天天喷,见面第一句,你还用JQ,赶紧丢了吧。但我也...

曾建凯
今天
4
0
聊聊storm的AggregateProcessor的execute及finishBatch方法

序 本文主要研究一下storm的AggregateProcessor的execute及finishBatch方法 实例 TridentTopology topology = new TridentTopology(); topology.newStream("spout1", spout......

go4it
今天
3
0
大数据教程(7.5)hadoop中内置rpc框架的使用教程

博主上一篇博客分享了hadoop客户端java API的使用,本章节带领小伙伴们一起来体验下hadoop的内置rpc框架。首先,由于hadoop的内置rpc框架的设计目的是为了内部的组件提供rpc访问的功能,并不...

em_aaron
今天
5
0
CentOS7+git+github创建Python开发环境

1.准备CentOS7 (1)下载VMware Workstation https://pan.baidu.com/s/1miFU8mk (2)下载CentOS7镜像 https://mirrors.aliyun.com/centos/ (3)安装CentOS7系统 http://blog.51cto.com/fengyuns......

枫叶云
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部