文档章节

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

没有更多内容

加载失败,请刷新页面

加载更多

【解惑】领略Java内部类的“内部”

内部类有两种情况: (1) 在类中定义一个类(私有内部类,静态内部类) (2) 在方法中定义一个类(局部内部类,匿名内部类) 1、私有内部类 —— 在方法之间定义的内部类,非静态 我们首先看看类中...

偶尔诗文
32分钟前
1
0
sqlserver 2008 r2 直接下载地址(百度云)

之前下载的sqlserver2008发现不能附加,就卸载了,重新找到了sqlserver2008R2的百度云资源 卸载sqlserver2008还是有点麻烦,不过就是需要删除注册表中的信息 自己来回卸载了3次终于重装sqlse...

dillonxiao
今天
1
0
[Java]JVM调优总结 -Xms -Xmx -Xmn -Xss

JVM调优总结 -Xms -Xmx -Xmn -Xss 博客分类: Java General JVM应用服务器电信CMS算法 堆大小设置 JVM 中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可...

morpheusWB
今天
2
0
C++ std::function 和 std::bind

C++11提供了std::function和std::bind两个工具,用于引用可调用对象。这些可调用对象包括 普通函数,Lambda表达式,类的静态成员函数,非静态成员函数以及仿函数等。引用可调用对象,可以用于...

yepanl
今天
4
0
python:可迭代对象的索引

关于 python的range的用法: 注意是[ 开始,结束)的半开区间,不包括结束 http://www.runoob.com/python/python-func-range.html import collectionsfrom collections import Iterable字符串......

Oh_really
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部