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 ...
随机推荐
- Codeforces 710 E. Generate a String (dp)
题目链接:http://codeforces.com/problemset/problem/710/E 加或者减一个字符代价为x,字符数量翻倍代价为y,初始空字符,问你到n个字符的最小代价是多少. d ...
- Spring JTA应用JOTM & Atomikos II JOTM
上节建立了一个简单的Java Application以及所需要的数据库和数据表,本节将介绍JOTM在Spring中的配置. JOTM(Java Open Transaction Manager)是Ob ...
- thinkphp过滤html、script
使用tp3.1版本 1.APP/common 自定义函数 function filter_default(&$value){ $value = htmlspecialchars($value) ...
- Java 线程池学习
Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具.真正的线程池接口是ExecutorService. 下面这张图完整描述了线程 ...
- The_Last_Geass
我在此立下最终的Flag,为了让它保持在第一条我不会再发任何说说:从吃晚饭开始心情就有些崩溃,感觉毫无希望.一直到现在三个多小时吧,想了很多写了很多也跑了两圈步,也许明白了些什么. 现在1月,距离省选 ...
- sql 自连接
这是一个部门表,里面存放了部门及其上级部门,但都放在同一张表中,我们假设现在需要用SQL查询出各部门及其上级部门!就如何做,当然,不用自连接也一样,可以如下: 我们达到预期目的!在这个查询中使用了一个 ...
- [转] [Visual Studio 2012] 找回 建立單元測試 選單
原文链接:http://www.dotblogs.com.tw/yc421206/archive/2013/03/08/95920.aspx Step1.建立選單 在VS2012選單,Tools→Cu ...
- cocos2d-x android java调用C++
转自:http://www.cnblogs.com/mokey/archive/2013/04/10/3012961.html java调用C++ 1.在jniHelper.java文件中定义一个方法 ...
- PL/pgSQL学习笔记之十
http://www.postgresql.org/docs/9.1/static/plpgsql-declarations.html 39.3.3. 类型拷贝 variable%TYPE %TYPE ...
- 数据对象ajax学习篇9
题记:写这篇博客要主是加深自己对数据对象的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢. 对ajax工作道理: 下面这段是来自一个网友的blog: Ajax的道理简单来说通过Xml ...