文档章节

NSOperation和NSOperationQueue

iossocket
 iossocket
发布于 2015/06/22 08:24
字数 869
阅读 49
收藏 0
点赞 0
评论 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多线程:『NSOperation、NSOperationQueue』详尽总结

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

法斗斗
04/20
0
0
iOS OS X 和 iOS 中的多线程技术-4 (NSOperation)

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

石虎132
2017/12/01
0
0
多线程NSOperation一般使用

一、NSOperation简介 简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperationQueue实现多线程的具体步骤: (1)先将需要执行的操...

朝雨晚风
2016/08/22
0
0
iphone多线程汇总

1,NSThread - (void)updateImageForCellAtIndexPath:(NSIndexPath )indexPath { NSAutoreleasePool pool = [[NSAutoreleasePool alloc] init]; UIImage *image = [self getImageForCellAtInd......

长平狐
2012/08/13
64
0
iOS--多线程之NSOperation

做一下整理,与大家分享,不足之处请留言: 使用NSOperation时,需要使用其子类:子类有三种方式 1.NSInvocationOperation 2.NSBlockOperation 3.自定义子类继承NSOperation,实现内部相应的...

指尖流年
2017/03/27
3
0
iOS多线程编程之NSOperation和NSOperationQueue的使用

目录(?)[-] iOS多线程编程之NSThread的使用 使用 NSOperation的方式有两种 一种是用定义好的两个子类 另一种是继承NSOperation NSInvocationOperation例子 第二种方式继承NSOperation 如何控...

malawo
2013/09/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Hbase增删查改工具类

package cn.hljmobile.tagcloud.service.data.repository;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util......

gulf
8分钟前
0
0
详解机器学习中的梯度消失、爆炸原因及其解决方法

前言 本文主要深入介绍深度学习中的梯度消失和梯度爆炸的问题以及解决方案。本文分为三部分,第一部分主要直观的介绍深度学习中为什么使用梯度更新,第二部分主要介绍深度学习中梯度消失及爆...

tantexian
9分钟前
0
0
JavaMail 发送邮件

参考 https://www.cnblogs.com/xdp-gacl/p/4216311.html 发送html格式邮件 package com.example.stumgr;import java.util.Properties;import javax.mail.Message;import javax.mail......

阿豪boy
10分钟前
0
0
Mongodb安装教程

MongoDB是一个基于分布式文件存储的数据库,是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bso...

木筏笔歆
11分钟前
0
0
Hadoop之YARN命令

概述 YARN命令是调用bin/yarn脚本文件,如果运行yarn脚本没有带任何参数,则会打印yarn所有命令的描述。 使用: yarn [--config confdir] COMMAND [--loglevel loglevel] [GENERIC_OPTIONS] [...

舒运
12分钟前
0
0
个推数据统计产品(个数)iOS集成实践

最近业务方给我们部门提了新的需求,希望能一站式统计APP的几项重要数据。这次我们尝试使用的是个推(之前专门做消息推送的)旗下新推出的产品“个数·应用统计”,根据官方的说法,个推的数...

个推
13分钟前
0
0
Git 修改提交的用户名和邮箱名字

在通过git提交代码时,发现提交的用户名是自己mac的账户名,想要修改为其他名字和邮箱。 首先可以通过以下命令查看当前配置下的信息,包括用户名和邮箱: > git config --list 针对单项目的相...

edwardGe
17分钟前
0
0
Object.defineProperty()

Object.defineProperty(obj, props)方法直接在一个对象上定义新的属性或修改现有属性,并返回该对象。 obj 在其上定义或修改属性的对象 props 要定义其可枚举属性或修改的属性描述符的对象 ...

litCabbage
18分钟前
0
0
JEESZ分布式框架--单点登录集成方案(三)

多项目集成单点登录配置 当sso验证完成之后,客户端系统需要接收sso系统返回的结果时,需要定义一个过滤器获取返回结果,然后针对返回结果做相关处理.如果不需要做处理时,此处Filter也可以不...

明理萝
18分钟前
0
1
超简单的利用plist 查看ipa包名及其它信息

1.下载ipa安装包 2.用rar等工具打开 3.将iTunesMetadata.plist文件解压出来 4.用http://www.atool.org/plist_reader.php在线反编译工具 5.在其中中找到softwareVersionBundleId 就是包名...

xiaogg
19分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部