1.NSOperation的作用

配合使用NSOperation和NSOperationQueue也能实现多线程编程。

2.NSOperation和NSOperationQueue实现多线程的具体步骤:

1)先将需要执行的操作封装到一个NSOperation对象中。

2)然后将NSOperation对象添加到NSOperationQueue中。

3)系统会自动将NSOperationQueue中的NSOperation取出来。

4)将取出来的NSOperation封装的操作放到一条新线程中执行。

3.NSOperation的子类

NSOperation是个抽象类,并不具备封装操作的能力,必须使用它的子类。

使用NSOperation子类的方式有3种:

1) NSInvocationOperation

2) NSBlockOperation

3) 自定义子类继承NSOperation,实现内部相应的方法。

4.基本使用代码示例

/* NSInvocationOperation使用*/

-(void)downloadImage:(id)obj

{

NSLog(@”%@”, obj);

}

//创建操作

NSOperation*op = [[NSInvocationOperation  alloc]initWithTarget:self selector:@selector(downloadImage:) object:@”Invocation”];

//启动,直接在当前线程执行

[opstart];

/*放到队列(GCD里面的并发队列(全局)队列使用最多。所以,NSOperationQueue技术直接把GCD里面的并发队列封装起来)。

NSOperationQueue队列,本质就是GCD里面的并发队列。*/

NSOperationQueue*queue = [[NSOperationQueue alloc] init];

//只要把操作添加到队列,会自动异步执行调度方法

[queueaddOperation:op];

/*NSBlockOperation 使用*/

//相当于GCD的并发队列

NSOperationQueue*queue = [[NSOperationQueue alloc]init];

for(int I= 0; I < 10; I ++){

//异步执行

NSBlockOperation *op = [NSBlockOperationblockOperationWithBlock:^{

NSLog(@”%@”, [NSThreadcurrentThread]);

}];

//把block操作放到队列中

[queue addOperation:op];

}

/*线程间通信*/

NSOperationQueue*queue = [[NSOperationQueue alloc]init];

[queueaddOperationWithBlock:^{

NSLog(@”耗时的操作 %@”,[NSThread currentThread]);

//在主线程更新UI

[[NSOperationQueue mainQueue]addOperationWithBlock:^{

//更新UI的操作

}];

}];

小结:

1) 只要是NSOperation的子类,就能添加到操作队列。

2) 一旦操作添加到队列,就会自动异步执行。

3) 如果没有添加到队列,而是使用start方法,会在当前线程执行操作。

4) 如果要做线程间通信,可以使用[NSOperationQueue mainQueue]拿到主队列,往主队列添加操作(更新UI)。

5.最大并发数

1)什么是并发数

同时执行的任务数。

比如,同时开3个线程执行3个任务,并发数就是3.

2)最大并发数的相关方法

-(NSInteger)maxConcurrentOperationCount;

-(void)setMaxConcurrentOperationCount:(NSInteger)cnt;

6.挂起

暂停/继续功能。

7.高级操作代码示例

/*并发数*/

/*一个程序中,负责所有的调度,全局的*/

NSOperationQueue*queue = [[NSOperationQueue alloc]init];

-(void)opDemo{

/*设置最大的并发数,是同时执行任务的数量,不是线程的数量。

任务刚执行完的时候,线程有一个回收到线程池,再拿出来使用的过程。所以这个时候,还有其他线程的话,则会直接拿来使用。*/

queue. maxConcurrentOperationCount = 2;

for(int I = 0; I < 10; I ++){

NSOperation*op = [NSBlockOperation blockOperationWithBlock:^{

NSLog(@”%@”,[NSThread currentThread]);

}];

[queueaddOperation:op];

}

}

/*挂起:暂停/继续*/

/*只是对队列的操作,不会影响已经在执行的操作。*/

queue.suspended= YES;

/*取消:取消队列里所有的操作*/

/*取消队列里的所有操作

取消操作,并不会影响队列的挂起状态。*/

[queuecancelAllOperation];

/*依赖关系*/

-(void)dependency

{

/*

例子:

1.      下载一个小说的压缩包。

2.      解压缩,删除压缩包。

3.      更新UI。

*/

NSBlockOperation *op 1 =[NSBlockOperation blockOperationWithBlock:^{

NSLog(@” 下载一个小说的压缩包”);

}];

NSBlockOperation *op 2 =[NSBlockOperation blockOperationWithBlock:^{

NSLog(@” 解压缩,删除压缩包”);

}];

NSBlockOperation *op3  = [NSBlockOperation  blockOperationWithBlock:^{

NSLog(@” 更新UI”);

}];

/*指定任务之间的依赖关系,依赖关系可以跨队列。(可以在子线程执行耗时操作,在主线程更新UI)*/

[op2 addDependency:op1];

[op3 addDependency:op2];

/*注意点:一定不要出现循环依赖关系。*/

// waitUntilFinished类似于GCD的调度组通知。NO,不等待,会直接执行后面的代码

[queue addOperation:@[op1, op2, op3]waitUntilFinished:YES];

//在主线程更新UI

[[NSOperationQueue mainQueue] addOperation:op3];

NSLog(@”yeah”);

}

8.GCD与NSOperation对比

GCD(iOS4.0推出):

将任务(block)添加到队列(串行/并发(全局)),指定执行任务的方法(同步(阻塞)/异步)。

拿到dispatch_get_main_queue(),线程间通信。

NSOperation无法做到一次性执行,延迟执行,调度组(NSOperation相对复杂)。

NSOperation(iOS2.0推出):

将操作(异步执行)添加到队列(并发/全局)中。

[NSOperationQueuemainQueue]拿到主队列,任务添加到主队列,就会在主线程执行。线程间通信。

GCD不好实现“最大并发数”。

挂起。

取消所有任务。

依赖关系。

9.内存警告

/*在真实开发中,一定要注意这个方法*/

-(void)didReceiveMemoryWaring

{

[super didReceiveMemoryWaring];

/*需要在这里做一些内存清理工作,如果不处理,会被系统强制闪退。*/

//清理缓存

//取消下载队列里面的任务

}

10.几种空

[NSNullnull]:空对象,可以放到字典或数组里。

NULL:C语言的空指针。

nil:OC指向空对象的指针。

Nil:空类。

11.block会有循环引用的风险(对外部的变量强引用)

self使用要注意。(block中,self可以这样使用:__weak typedef(self) weakSelf = self;)

借助dealloc方法,判断是否循环引用。

12.自定义NSOperation

步骤:

1)创建继承NSOperation的类。

2)在新创建的类里重写-(void)main方法,在里面实现想要执行的任务。

重写-(void)main方法注意点:

1>    自己创建自动释放池(因为如果是异步操作,无法访问主线程的自动释放池)。

2>    经常通过-(BOOL)isCancelled方法检测操作是否被取消,对取消做出响应。

NSOperation简介的更多相关文章

  1. 多线程之NSOperation简介

    在iOS开发中,为了提升用户体验,我们通常会将操作耗时的操作放在主线程之外的线程进行处理.对于正常的简单操作,我们更多的是选择代码更少的GCD,让我们专注于自己的业务逻辑开发.NSOperation在 ...

  2. AJ学IOS(53)多线程网络之NSOperation简介

    AJ分享,必须精品 一:简单介绍 1:NSOperation的作⽤使用步骤: 配合使用NSOperation和NSOperationQueue也能实现多线程编程. NSOperation和NSOper ...

  3. iOS开发多线程篇—NSOperation简单介绍

    iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...

  4. 多线程基础 (八)NSOperation相关

    额外的参考学习可以学习:http://www.cnblogs.com/YouXianMing/p/3707403.html 1.NSOperation简介   NSOperation的作用 配合使用N ...

  5. IOS多线程之NSOperation学习总结

    NSOperation简介 1.NSOperation的作用 配合使用NSOperation和NSOperationQueue也能实现多线程编程 2.NSOperation和NSOperationQu ...

  6. iOS多线程编程--NSOperation(转)

    这篇文章写得非常不错,基础用法都涉及到了,我把文章提到的例子都写到了demo里面, 原文地址: iOS多线程--彻底学会多线程之『NSOperation』 demo下载:https://github. ...

  7. iOS 开发多线程 —— NSOperation

    本文是根据文顶顶老师的博客学习而来,转载地址:http://www.cnblogs.com/wendingding/p/3809042.html 一.NSOperation简介 1.简单说明 NSOp ...

  8. iOS多线程编程之NSOperation的基本操作(转载)

    一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现多线程编程 NSOperation和NSOperat ...

  9. 【iOS开发】NSOperation简单介绍

    iOS开发多线程篇—NSOperation简单介绍 一.NSOperation简介 1.简单说明 NSOperation的作⽤:配合使用NSOperation和NSOperationQueue也能实现 ...

随机推荐

  1. Android JNI和NDK学习(05)--JNI真机调试(转)

    本文转自: http://www.cnblogs.com/skywang12345/archive/2013/05/23/3094250.html 本文主要介绍如何将JNI导入到真机进行调试.下面以M ...

  2. Timer和ScheduledExecutorService区别

    Timer特点:   1.一个Timer只占用一个线程 timer有多个timerTask的情况,如果一个timerTask有执行时间过长,其它的timerTask就会被耽误 2.如果TimerTas ...

  3. Python内置函数之open()

    open(file, mode=, encoding=None, errors=None, newline=None, closefd=True, opener=None) 打开一个文件,返回一个对应 ...

  4. Hibernate标准查询语言

    Hibernate标准(Criteria)查询语言(HCQL)用于根据具体条件获取记录.Criteria接口提供了应用标准的方法,例如检索薪水大于50000的表的所有记录. HCQL的优势 HCQL提 ...

  5. Eclipse 浏览(Navigate)菜单浏览 Eclipse 工作空间

    Eclipse 浏览(Navigate)菜单 浏览 Eclipse 工作空间 浏览(Navigate)菜单提供了多个菜单可以让你快速定位到指定资源. 上图中 Open Type, Open Type ...

  6. css 定位标签设置格式

    td a {      color: #3c8dbc; } td a:hover {      color: #00bdd8; } 上例即为定位td下的a标签.即用来给表格中的链接,未访问时和hove ...

  7. Unity3D学习笔记——GUI高级组件

    Unity3D中的高级控件都是由GUI类引出的,高级控件是由系统实现的,所以效率很高,但也可以自己实现,优点是任意修改灵活性高. 一:Label控件:用于展示一段文字的控件.可以输入字符串,也可以是贴 ...

  8. PowerDesigner 建模后如何导入到数据库

    from:https://jingyan.baidu.com/article/7f766daf465e9c4101e1d0d5.html 大家都知道PowerDesigner是一个数据库建模工具,但是 ...

  9. poj1742

    Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 33998   Accepted: 11554 Descripti ...

  10. EF 批量更新删除(linq篇)

    刚开始用EF很多东西都不会用,事后想想都很简单的东西总是用很麻烦的方式实现 1:  EF的联合查询 inner join  很久很久以前我是这么写一个列表展示的,其中有两个字段Contractor和M ...