深入学习NSOperationQueue

目前在 iOS 有两套先进的多线程同步 API 可供我们使用NSOperation 和 GCD 。其中 GCD 是基于 C 的底层的 API ,而 NSOperation 则是 GCD 实现的 Objective-C API。

为何推荐NSOperationQueue

如果GCD那么我们的网络请求数据的方法应该是这样的

dispatch_async(_Queue, ^{

  //请求数据
  NSData *data = [NSData dataWithContentURL:[NSURL URLWithString:@"http://domain.com/a.png"]];

    dispatch_async(dispatch_get_main_queue(), ^{
//回去主线程刷新UI

    });
});

整体来说代码简洁度看着还是比较优雅,但是仔细看就会发现,本请求是无法cancel的,紧接而来的蛋疼问题就多了你觉得呢?

那么我们就需要解决这令人上火的问题,自然NSOprationQueue就成了GCD的替代品,那么NSOprationQueue的优势到底在哪里?

优势:

  1. 可以取消一个执行的NSOperation
  2. 可以很方便的添加任务的依赖关系
  3. 提供了各个人的的当前状态

NSOperationQueue的使用

NSOperationQueue有两种不同的队列

  1. 自定义队列
  2. 主队列

自定义队列在后台执行,主队列在主线程执行 任务队列有两种:

  • NSBlockOperation
  • NSInvocationOperation

他们都继承自 NSOperation。他们的用法应该是这样的:

*NSBlockOperation*

NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //自定义队列
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
               //任务执行
            }];
[queue addOperation:operation];

* NSInvocationOperation*

NSOperationQueue *queue = [[NSOperationQueue alloc] init]; //自定义队列
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(_SEL) object:nil];
[queue addOperation:operation];

Queue的一个属性maxConcurrentOperationCount ,我们可以通过设这个数来限制queue的并行还是串行队列,当maxConcurrentOperationCount = 1时候为串行队列,否则为并行队列。

NSOperation

如果我们用这个就必须继承自NSOperation,然后重写main方法,顺便有个更为令人惊喜的事情就是,重写的NSOperation是可以cancel掉正在执行的Operation的,这样就便于我们操作NSOperation的各种非正常状态如:莫名卡死之类的BUG

使用 main 方法非常简单,开发者不需要管理一些状态属性当 main 方法返回的时候,这个 operation 就结束了。

@implementation YourOperation
- (void)main
{
 @autoreleasepool {

       // 任务代码 ...
    }

}
@end

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 08:54:19

深入学习NSOperationQueue的相关文章

Cocoa深入学习:NSOperationQueue、NSRunLoop和线程安全 (转)

目前在 iOS 和 OS X 中有两套先进的同步 API 可供我们使用:NSOperation 和 GCD .其中 GCD 是基于 C 的底层的 API ,而 NSOperation 则是 GCD 实现的 Objective-C API. 虽然 NSOperation 是基于 GCD 实现的, 但是并不意味着它是一个 GCD 的 “dumbed-down” 版本, 相反,我们可以用NSOperation 轻易的实现一些 GCD 要写大量代码的事情. 因此, NSOperationQueue 是被

iOS学习资源搜集

最快速的学习方法是站在别人的肩上,当有人给你垫脚,那就必须往远处看.以下是遇到的一些好的学习资源. AutoLayout / SizeClass 开始iOS 7中自动布局教程(一) 开始iOS 7中自动布局教程(二) Auto Layout 使用心得(一)—— 初体验 Auto Layout 使用心得(二)—— 实现三等分 xcode6中自动布局autolayout和sizeclass的使用 xcode6下使用autolayout+sizeclass实践 ios8新特性屏幕适配之sizeclas

【原】SDWebImage源码阅读(三)

[原]SDWebImage源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1.SDWebImageDownloader中的downloadImageWithURL 我们来到SDWebImageDownloader.m文件中,找到downloadImageWithURL函数.发现代码不是很长,那就一行行读.毕竟这个函数大概做什么我们是知道的.这个函数大概就是创建了一个SDWebImageSownloader的异步下载器,根据给定的URL下载image. 先映入眼帘的

iOS学习笔记12-网络(一)NSURLConnection

一.网络请求 在网络开发中.须要了解一些经常使用的请求方法: GET请求:get是获取数据的意思,数据以明文在URL中传递,受限于URL长度,所以数据传输量比較小. POST请求:post是向server提交数据的意思.提交的数据以实际内容形式存放到消息头中进行传递,无法在浏览器url中查看到,大小没有限制. HEAD请求:请求头信息,并不返回请求数据体,而仅仅返回请求头信息,经常使用用于在文件下载中取得文件大小.类型等信息. 二.NSURLConnection NSURLConnection是

Swift 学习-多线程

1:第一种多线程 func fun1(){ for i in 200...300{ NSLog("%d",i); } } func fun2(){ for i in 300...400{ NSLog("%d",i); } } var th1 = NSThread(target:self,selector:"fun1",object:nil); th1.start(); //开启线程 NSThread.detachNewThreadSelector

ASIHTTPRequest学习笔记

1.creating requestsrequest分为同步和异步两种.不同之处在于开始request的函数:[request startSynchronous];[request startAsynchronous];其中,异步的request构造方式如下:- (void) grabURLs{    NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];//url需要添加http://    ASIHTTPRequest

ios学习记录 day41 UI17 多线程

CPU(工厂) 进程(车间) 线程(工人) 一个进程代表一个应用程序 CPU总是运行一个进程,其它进程处于非运行状态.一个进程可以包含多个线程.线程与线程之间可以共享进程的内存区域. 打开一个应用程序,系统会给我们创建一个线程,称为主线程 管理主界面的UI与内部循环机制(与界面相关的东西必须放在主线程中!!!) 压力比较大且会造成线程阻塞(界面卡),因此我们通过创建子线程来对主线程进行分压. 什么时候用多线程 1.网络请求(同步的) 2.文件读写(少) 3.大数据计算(冒泡) 4.数据库sele

iOS学习之旅10 ATS(App Transport Security)对HTTPS协议要求引起的问题

问题描述 编写以下代码获取网络某个资源的MIMEType 1 -(void)getMIMEType 2 { 3 //路径 4 NSURL *url = [NSURL URLWithString:@"https://www.baidu.com/img/bd_logo1.png"]; 5 //请求对象 6 NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 7 NSOperationQueue *

学习 ...

转载自:http://www.jianshu.com/p/fe529a7e83a0 我一直认为,对于程序员来说,写一天代码不算什么,也许这只是解决了一个bug,或者干脆就没能搞定.一周的时间学习内容页有限,可能是一两个困扰已久的知识点终于悟透了,也可能是新学了某个知识点.但是和一个月前的自己相比,总是感觉自己进步颇大,和一年前的自己相比,就有一种判若两人的感觉了.2015就要过去了,我想有必要总结一下这一年来的收获得失. 从小白开始 从去年年底正式开始写iOS开始,到大约三四月份,一直在开发自己