NSOperation与GCD之间的关系
NSOperation与GCD的相同之处
1.NSOperation和NSOperationQueue实现多线程的步骤:
先将需要执行的操作封装到一个NSOperation对象中。
然后将NSOperation对象添加到NSOperationQueue中。
系统会自动将NSOperationQueue中的NSOperation取出来。
将取出的NSOperation封装的操作放到一条新线程中执行。
2.NSOperation是一个抽象类,并不具备封装操作的能力,必须使用它的子类。
使用NSOperation子类的方式有三种:
NSInvocationOperation
NSBlockOperation
自定义子类继承NSOperation,实现内部相应的方法。
NSOperation其实就是对GCD的一个封装。
创建NSInvocationOperation对象
-(id)initWithTarget:(id) target selector:(SEL)sel object:(id) arg;
调用start方法开始执行操作
-(void)start;
一旦执行操作,就会调用target的sel方法。
注意:默认情况下,调用了start方法后并不会开一条新线程去执行操作,而是在当前线程同步执行操作。
只有将NSOperation放到一个NSOperationQueue中,才会异步执行操作
创建NSBlockOperation对象
+(id)blockOperationWithBlock:(void (^)(void)) block;
通过addExecutionBlock:方法添加更多的操作
-(void)addExecutionBlock:(void (^)(void)) block;
注意:只要NSBlockOperation封装的操作数>1, 就会异步执行操作。
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// [self opDemo1];
// [self opDemo2];
// [self opDemo3];
[self opDemo4];
} - (void)down
{
for (int i = ; i < ; i ++) {
NSLog(@"%d", i+);
}
} #pragma mark - 单个NSInvocationOperation使用
- (void) opDemo1
{
NSLog(@"");
//创建操作
NSOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(down) object:@"Invocation"];
//直接在当前线程执行(同步执行)【没有开辟线程】
[op start];
//放到队列gg
// NSOperationQueue * que = [[NSOperationQueue alloc] init];
// //只要把操作添加到队列,就会异步执行任务(但是任务中的任务会顺序执行)【开辟了线程】
// [que addOperation:op];
NSLog(@"");
} - (void) opDemo2
{
NSLog(@"");
/**
1.队列(GCD里面的并发(全局)队列使用最多),所以NSOperation技术直接把GCD里面的并发技术封装起来
2.NSOperationQueue,本质就是GCD里面的并发队列
3.操作是GCD里面的异步执行的任务
**/
NSOperationQueue * q = [[NSOperationQueue alloc] init];
for (int i = ; i < ; i ++) {
NSOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(down) object:@"Invocation"];
[q addOperation:op];
}
NSLog(@"");
} - (void) opDemo3
{
NSLog(@"");
//相当于GCD主队列
NSOperationQueue * q = [NSOperationQueue mainQueue];
//当NSOpertaion获取主线程,不会在开辟线程,但是里面的任务会在其他主线程任务执行完成后才回归执行
for (int i = ; i < ; i ++) { NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"%@==========%d", [NSThread currentThread], i);
}];
//将block放入到队列
//block中可以添加多个任务
[q addOperation:op];
}
NSLog(@""); }

- (void) opDemo4
{
NSLog(@"");
NSOperationQueue * q = [[NSOperationQueue alloc] init];
//block块中可以写多个任务(里面串行队列),相当于GCD中的并行串行队列
NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"");
NSLog(@"");
NSLog(@"");
}];
[q addOperation:op];
//还可以在外面给队列添加任务.但是遵循fifo
[op addExecutionBlock:^{
NSLog(@"");
NSLog(@"");
}];
NSLog(@"");
}
NSOperation与GCD之间的关系的更多相关文章
- RunLoop总结:RunLoop 与GCD 、Autorelease Pool之间的关系
如果在面试中问到RunLoop相关的知识,很有可能也会问到RunLoop与GCD.Autorelease Pool有没有关系,哪些地方用到了GCD.Autorelease Pool等. So,本文就总 ...
- iOS开发-NSOperation与GCD区别
Mac OS X 10.6及iOS4.0之后导入了可以使全体线程更高效运行,并且使并行处理应用更易开发的架构,GCD(Grand Central Dispatch),同时引入的还有Run Loop, ...
- iOS开发笔记5:多线程之NSThread、NSOperation及GCD
这篇主要总结下iOS开发中多线程的使用,多线程开发一般使用NSThread.NSOperation及GCD三种方式,常用GCD及NSOperation. 1.NSThread 创建线程主要有以下三种方 ...
- iOS开发之多线程(NSThread、NSOperation、GCD)
整理一些多线程相关的知识. 并行 & 并发 1.并行:并行是相对于多核而言的,几个任务同时执行.2.并发:并发是相对于单核而言的,几个任务之间快速切换运行,看起来像是"同时" ...
- .NET Core与.NET Framework、Mono之间的关系
随着微软的.NET开源的推进,现在在.NET的实现上有了三个.NET Framework,Mono和.NET Core.经常被问起Mono的稳定性怎么样,后续Mono的前景如何,要回答这个问题就需要搞 ...
- .NET Core 和 .NET Framework 之间的关系
引用一段描述:Understanding the relationship between .NET Core and the .NET Framework. .NET Core and the .N ...
- 实体之间的关系【Entity Relationships】(EF基础系列篇9)
Here, you will learn how entity framework manages the relationships between entities. Entity framewo ...
- php CGI、Fastcgi、PHP-FPM的详细介绍与之间的关系
以下PHP CGI.Fastcgi.PHP-FPM的一些信息归纳和汇总----->详细介绍与之间的关系 一:CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的 web ...
- [转] valuestack,stackContext,ActionContext.之间的关系
三者之间的关系如下图所示: ActionContext 一次Action调用都会创建一个ActionContext 调用:ActionContext context = ActionContext ...
随机推荐
- springMVC在jsp传对象到后台
==============实体entity======================= package com.jb.pub.entity; import java.io.Serializable ...
- 使用servlet实现文件上传
package com.zhanghaobo.fileupload; import java.io.File; import java.io.IOException; import java.util ...
- C#核心基础--类(2)
C#核心基础--类的声明 类是使用关键字 class 声明的,如下面的示例所示: 访问修饰符 class 类名 { //类成员: // Methods, properties, fields, eve ...
- Json.Net学习笔记
http://www.cnblogs.com/xiaojinhe2/archive/2011/10/28/2227789.html Newtonsoft.Json(Json.Net)学习笔记 http ...
- 小知识~让你的DLL类库带上注释
在我们进行开发公用组件时,一般会把DLL给团队的开发人员直接使用,而不会把项目给他们,因为那样对为框架级代码是不安全的,这时引用框架类库有两种方式,一种是直接复制DLL,第一种是使用包管理工具Nuge ...
- phantomjs
PhantomJS是以WebKit为核心并提供JavaScript编程接口(API)的无界面浏览器. 它提供对web标准的 快速 并且 原生 的支持: DOM操作.CSS选择符.JSON.Canvas ...
- 浅析WINFORM工具条的重用实现
一直以来,我都想看看别人家的工具栏重用(图1)到底是如何实现的,但在网上搜索了很久都没有找到过,即使找到一些程序,要么就是把这个工具栏写在具体的画面(图2),要么就是没有源代码的, 我在想,是否别人也 ...
- silverlight调用MVC WebApi方法
1.创建ASP.NET MVC4 Web应用程序,选择WebAPI模板 2.添加silverlight项目 3.新建一个数据模型类,代码如下: using System; using System.C ...
- SCVMM之Windows Server2012 R2新功能
在Windows Server 2012 R2中可以通过使用共享的虚拟硬盘VHDX文件的方法来模拟IP SAN,来为虚拟机创建群集提供共享存储.这样为虚拟机创建群集时就不用再像以前一样通过使用软件模拟 ...
- iOS中CollectionView由于多次点击造成错误的解决方案
iOS中CollectionCiew由于多次点击,会给程序造成错误. 这个时候,我们可以用过手势类来进行判断和过滤. 但是,有一个快捷的解决方法,那就是给用户响应增加延时操作. 具体代码如下: [co ...