NSOperation和NSOperationQueue
NSOperation和NSOperationQueue
iossocket 发表于2年前
NSOperation和NSOperationQueue
  • 发表于 2年前
  • 阅读 49
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云 新注册用户 域名抢购1元起>>>   

摘要: 介绍NSOperation和NSOperationQueue的使用方法

介绍    

    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时,此队列为一个串行队列。






共有 人打赏支持
粉丝 5
博文 18
码字总数 8603
评论 (0)
×
iossocket
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: