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 ...
随机推荐
- webbench压力测试
webbench最多可以模拟3w多个并发请求去测试网站负载能力. 一:获取webbench工具,安装编译: wget http://blog.zyan.cc/soft/linux/webbench/w ...
- jedis提供的功能
Sorting(排序) Connection handling(连接池) Commands operating on any kind of values Commands operating on ...
- 测试rest接口的两个工具使用详解(restclient+soapUI)
http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/31/3110764.html http://www.oschina.net/news/618 ...
- java.util.Date转java.sql.Date丢失时间问题
java.sql.Date 只存储日期数据不存储时间数据// 会丢失时间数据preparedStatement.setDate(1, new java.sql.Date(date.getTime()) ...
- Flex4 DataGrid ItemRenderer内嵌方式
Flex4 DataGrid ItemRenderer像Flex3一直内嵌ItemRenderer会报空对象引用的错误,如: <s:GridColumn dataField="titl ...
- Simple Worker Thread Class
http://www.codeproject.com/Articles/36184/Simple-Worker-Thread-Class Introduction Many times we need ...
- ClassRequestHandler or VendorRequestHandler wIndex must be less than NumIFs
P1_ro:20000EEA ClassRequestHandler ; CODE XREF: USB__HandleSetup+38j P1_ro:20000EEA LDRB R0, [R4,#4] ...
- MariaDB5.5.32 绿色版下载安装一条龙
1.下载地址: http://ftp.yz.yamagata-u.ac.jp/pub/dbms/mariadb/mariadb-5.5.32/win32-packages/mariadb-5.5.32 ...
- 什么是双线双IP,什么叫双线双IP
双线双IP实现双线路,拥有中国电信.中国网通骨干网的接入,在该机房托管的服务器,实现了电信和网通的双线路接入,使电信和网通的用户都能以非常快的速度连接到服务器,解决了电信和网通互相访问速度慢的问题.这 ...
- 编写高效的Android代码
编写高效的Android代码 毫无疑问,基于Android平台的设备一定是嵌入式设备.现代的手持设备不仅仅是一部电话那么简单,它还是一个小型的手持电脑,但是,即使是最快的最高端的手持设备也远远比不上一 ...