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之间的关系的更多相关文章

  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. HDU3535AreYouBusy(分组背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=3535 分组背包,每一组加了以下三个限制 0 stands for the sets that should ch ...

  2. Android 显示/隐藏 应用图标

    PackageManager packageManager = getPackageManager(); ComponentName componentName = new ComponentName ...

  3. 用vagrant搭建一个自己的lnmp环境(一)

    用vagrant搭建自己的lnmp环境 1.工具: a.vagrant b.virtual box c.linux服务器box(此处我使用centos 7.0) 2.安装完vagrant和virtua ...

  4. 编译cscope-15.8a遇到的问题与解决方案

    1)环境 主机:Linux ubuntu 3.2.0-32-generic-pae #51-Ubuntu SMP Wed Sep 26 21:54:23 UTC 2012 i686 i686 i386 ...

  5. Simple Worker Thread Class

    http://www.codeproject.com/Articles/36184/Simple-Worker-Thread-Class Introduction Many times we need ...

  6. The IAR Archive Tool—iarchive

    The IAR Archive Tool—iarchive—creates and manipulates a library (anarchive) of several ELF object fi ...

  7. vim复制多行<转>

    比如我要复制从第1行到第5行的数据,复制到第9行 光标移到第5行任意位置,输入ma光标移到第1行任意位置,输入y'a(这一定要打这个“'”单引号,否则就进入“INSERT”状态了光标移到需要复制的行, ...

  8. C# DataGridView中合并单元格

    /// 合并GridView列中相同的行 /// /// GridView对象 /// 需要合并的列 public static void GroupRows(GridView GridView1, ...

  9. C#操作Word (2)-- 打开&关闭Word文档

    本文正式开始在VS2010中使用C#语言操作Word2007. 不是十分了解Word对象模型的朋友,请参考上一篇文章,或者下载:C#操作Word2007.pdf. ------------------ ...

  10. 网易新闻优化APK下载链接

    你好,欢迎你的访问! 本次是APK包的下载链接: 点我下载 这是我目前实现的效果,正在完善中...