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, 就会异步执行操作。

  1. - (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
  2. {
  3. // [self opDemo1];
  4. // [self opDemo2];
  5. // [self opDemo3];
  6. [self opDemo4];
  7. }
  8.  
  9. - (void)down
  10. {
  11. for (int i = ; i < ; i ++) {
  12. NSLog(@"%d", i+);
  13. }
  14. }
  15.  
  16. #pragma mark - 单个NSInvocationOperation使用
  17. - (void) opDemo1
  18. {
  19. NSLog(@"");
  20. //创建操作
  21. NSOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(down) object:@"Invocation"];
  22. //直接在当前线程执行(同步执行)【没有开辟线程】
  23. [op start];
  24. //放到队列gg
  25. // NSOperationQueue * que = [[NSOperationQueue alloc] init];
  26. // //只要把操作添加到队列,就会异步执行任务(但是任务中的任务会顺序执行)【开辟了线程】
  27. // [que addOperation:op];
  28. NSLog(@"");
  29. }
  30.  
  31. - (void) opDemo2
  32. {
  33. NSLog(@"");
  34. /**
  35. 1.队列(GCD里面的并发(全局)队列使用最多),所以NSOperation技术直接把GCD里面的并发技术封装起来
  36. 2.NSOperationQueue,本质就是GCD里面的并发队列
  37. 3.操作是GCD里面的异步执行的任务
  38. **/
  39. NSOperationQueue * q = [[NSOperationQueue alloc] init];
  40. for (int i = ; i < ; i ++) {
  41. NSOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(down) object:@"Invocation"];
  42. [q addOperation:op];
  43. }
  44. NSLog(@"");
  45. }
  46.  
  47. - (void) opDemo3
  48. {
  49. NSLog(@"");
  50. //相当于GCD主队列
  51. NSOperationQueue * q = [NSOperationQueue mainQueue];
  52. //当NSOpertaion获取主线程,不会在开辟线程,但是里面的任务会在其他主线程任务执行完成后才回归执行
  53. for (int i = ; i < ; i ++) {
  54.  
  55. NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
  56. NSLog(@"%@==========%d", [NSThread currentThread], i);
  57. }];
  58. //将block放入到队列
  59. //block中可以添加多个任务
  60. [q addOperation:op];
  61. }
  62. NSLog(@"");
  63.  
  64. }

  1. - (void) opDemo4
  2. {
  3. NSLog(@"");
  4. NSOperationQueue * q = [[NSOperationQueue alloc] init];
  5. //block块中可以写多个任务(里面串行队列),相当于GCD中的并行串行队列
  6. NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
  7. NSLog(@"");
  8. NSLog(@"");
  9. NSLog(@"");
  10. }];
  11. [q addOperation:op];
  12. //还可以在外面给队列添加任务.但是遵循fifo
  13. [op addExecutionBlock:^{
  14. NSLog(@"");
  15. NSLog(@"");
  16. }];
  17. NSLog(@"");
  18. }

NSOperation与GCD之间的关系的更多相关文章

  1. RunLoop总结:RunLoop 与GCD 、Autorelease Pool之间的关系

    如果在面试中问到RunLoop相关的知识,很有可能也会问到RunLoop与GCD.Autorelease Pool有没有关系,哪些地方用到了GCD.Autorelease Pool等. So,本文就总 ...

  2. iOS开发-NSOperation与GCD区别

    Mac OS X 10.6及iOS4.0之后导入了可以使全体线程更高效运行,并且使并行处理应用更易开发的架构,GCD(Grand Central  Dispatch),同时引入的还有Run Loop, ...

  3. iOS开发笔记5:多线程之NSThread、NSOperation及GCD

    这篇主要总结下iOS开发中多线程的使用,多线程开发一般使用NSThread.NSOperation及GCD三种方式,常用GCD及NSOperation. 1.NSThread 创建线程主要有以下三种方 ...

  4. iOS开发之多线程(NSThread、NSOperation、GCD)

    整理一些多线程相关的知识. 并行 & 并发 1.并行:并行是相对于多核而言的,几个任务同时执行.2.并发:并发是相对于单核而言的,几个任务之间快速切换运行,看起来像是"同时" ...

  5. .NET Core与.NET Framework、Mono之间的关系

    随着微软的.NET开源的推进,现在在.NET的实现上有了三个.NET Framework,Mono和.NET Core.经常被问起Mono的稳定性怎么样,后续Mono的前景如何,要回答这个问题就需要搞 ...

  6. .NET Core 和 .NET Framework 之间的关系

    引用一段描述:Understanding the relationship between .NET Core and the .NET Framework. .NET Core and the .N ...

  7. 实体之间的关系【Entity Relationships】(EF基础系列篇9)

    Here, you will learn how entity framework manages the relationships between entities. Entity framewo ...

  8. php CGI、Fastcgi、PHP-FPM的详细介绍与之间的关系

    以下PHP CGI.Fastcgi.PHP-FPM的一些信息归纳和汇总----->详细介绍与之间的关系 一:CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的 web ...

  9. [转] valuestack,stackContext,ActionContext.之间的关系

    三者之间的关系如下图所示: ActionContext  一次Action调用都会创建一个ActionContext  调用:ActionContext context = ActionContext ...

随机推荐

  1. MetaQ安装部署文档

    一.MetaQ安装部署情况: 地点 IP Broker ID Master/Slave Slave ID:Group 合肥 192.168.52.23 Slave 1:meta-slave-group ...

  2. C#图解教程读书笔记(第15章 委托)

    委托是C#的一个很重要的知识点. 1.什么是委托 委托在我认为,就是一系列格式相同的方法列表,可能就是定义的名称不一致,参数.返回值等都是一样的. 2.如何声明委托 delegate void MyF ...

  3. hdoj 5344 MZL's xor

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5344 #include<stdio.h> #include<cstring> ...

  4. Objc基础学习记录5

    NSMutableString类继承的NSString类. NSMutableString是动态的字符串. 1.appendingString 方式: 向字符串尾部添加一个字符串. 2.appendi ...

  5. 快速排序详解以及java实现

    快速排序作为一种高效的排序算法被广泛应用,SUN的JDK中的Arrays.sort 方法用的就是快排. 快排采用了经典的分治思想(divide and conquer): Divide:选取一个基元X ...

  6. (C++)STL排序函数sort和qsort的用法与区别

    主要内容: 1.qsort的用法 2.sort的用法 3.qsort和sort的区别 qsort的用法: 原 型: void qsort(void *base, int nelem, int widt ...

  7. EXchange2010配置

    DAG配置: 组织配置:如果见证服务器是DC不是exchange服务器,那么需要在AD用户和计算机里面,将exchange trusted subsystem 添加到 DC的本地管理员组(/built ...

  8. 一次JQuery性能优化实战

    同事写了段JQuey的代码,在某些机器上,会出现IE假死的性能问题. 我测试了一下代码花费的时间,在我的机器上,会花费600多毫秒,但在某些机器上会花费6秒多(10倍的增长),这样就导致了IE的假死. ...

  9. 由linux内核某个片段(container_of)引发的对于C语言的深入理解

    /usr/src/linux-source-3.8.0/drivers/gpu/drm/radeon 这个文件夹以下 去找到这个文件 mkregtable.c  打开,就能够看到了. #define ...

  10. iframe自适应高度的多种方法小结

    转自:http://www.jb51.net/article/15780.htm 不带边框的iframe因为能和网页无缝的结合从而不刷新页面的情况下更新页面的部分数据成为可能,可是 iframe的大小 ...