iOS开发--多线程编程(三)NSOperation
来源:互联网 发布:如何查看知乎提问者 编辑:程序博客网 时间:2024/04/30 08:24
NSOperation是一个基类(抽象类)不能直接使用,必须使用他的子类它默认是在当前线程进行操作如果单独使用 NSOperation必须手动启动
常与 NSOperationQueue一起使用。在与 NSOperationQueue一起使用会自动开辟线程进行操作不用手动启动
NSOperation系统提供的两个子类
NSInvocation ,NSBlockOperation
1,NSInvocation 单一使用 它是同步执行的
2,NSBlockOperation(操作数>1,也会开辟线程去执行操作
NSOperation类是用来封装与单个任务相关的代码和数据的抽象类,因为它是抽象的,你不能直接使用这个类
下面是使用案例:
1,使用 NSInvocation:
#import "ViewController.h"@interface ViewController ()@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; // 不能直接使用 operation 是因为 它里面 没有可以直接操作的方法,只是一个基类 NSInvocationOperation *invocation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(act:) object:@"invocation"]; invocation.name = @"invocation";// 如果单独使用 NSInvocationOperation 的话,必须手动启动// [invocation start]; // 不能直接使用 operation 是因为 它里面 没有可以直接操作的方法,只是一个基类 NSInvocationOperation *invocation11 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(act1:) object:@"invocation11"]; invocation11.name = @"invocation11"; // 如果单独使用 NSInvocationOperation 的话,必须手动启动// NSOperationQueue 不需要手动启动// [invocation11 start]; // operation 默认是在当前线程 去执行 (同步执行) NSInvocationOperation *invocation12 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(act2:) object:@"invocation12"]; invocation12.name = @"invocation12"; NSInvocationOperation *invocation13 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(act3:) object:@"invocation13"]; invocation13.name = @"invocation13"; NSInvocationOperation *invocation14 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(act4:) object:@"invocation14"]; invocation14.name = @"invocation14"; NSInvocationOperation *invocation15 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(act5:) object:@"invocation15"]; invocation15.name = @"invocation15"; NSInvocationOperation *invocation16 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(act6:) object:@"invocation16"]; invocation16.name = @"invocation16";// 可以使用线程队列去 NSOperationQueue 管理线程 (默认会开辟线程去执行)// 不用手动启动线程// 异步执行 NSOperationQueue *queue = [[NSOperationQueue alloc]init];// 可以设置线程队列的最大并发数(最多可以允许几个操作 同时执行),线程池中的线程数,也就是并发操作数。默认情况下是-1,-1表示没有限制,这样会同时运行队列中的全部的操作。 queue.maxConcurrentOperationCount = 2; [queue addOperation:invocation]; [queue addOperation:invocation16]; [queue addOperation:invocation11]; [queue addOperation:invocation12]; [queue addOperation:invocation14]; [queue addOperation:invocation13]; [queue addOperation:invocation15];}- (void)act:(id)sender{ NSLog(@"%@ %@",[NSThread currentThread],sender);}- (void)act1:(id)sender{ NSLog(@"111111111111");}- (void)act2:(id)sender{ NSLog(@"22222222222");}- (void)act3:(id)sender{ NSLog(@"33333333333");}- (void)act4:(id)sender{ NSLog(@"444444444444");}- (void)act5:(id)sender{ NSLog(@"55555555555");}- (void)act6:(id)sender{ NSLog(@"666666666666");}
输出结果: 可见输出与方法的调用顺序是不一样的,因为是异步
2016-04-27 15:47:54.526 多线程二[3177:369520] 6666666666662016-04-27 15:47:54.526 多线程二[3177:369519] <NSThread: 0x7fd452b0b250>{number = 2, name = (null)} invocation2016-04-27 15:47:54.527 多线程二[3177:369520] 222222222222016-04-27 15:47:54.527 多线程二[3177:369524] 1111111111112016-04-27 15:47:54.527 多线程二[3177:369527] 4444444444442016-04-27 15:47:54.527 多线程二[3177:369520] 333333333332016-04-27 15:47:54.527 多线程二[3177:369524] 55555555555
2,使用 NSBlockOperation
同样是异步操作
NSBlockOperation *blockOperation = [NSBlockOperation blockOperationWithBlock:^{// 具体执行的方法 [self act:@"blockOperation"]; }]; // 添加操作// 当 NSBlockOperation 的操作数大于1的时候 会开辟线程执行 [blockOperation addExecutionBlock:^{ [self act:@"fgggfhg---------"]; }]; [blockOperation addExecutionBlock:^{ [self act:@"ioierjewr5htwj43oir"]; }]; [blockOperation addExecutionBlock:^{ [self act:@"i------htwj43oir"]; }]; [blockOperation addExecutionBlock:^{ [self act:@"ioierje-------+++++wr5htwj43oir"]; }]; [blockOperation start];
输出结果:同样是异步,所以顺序不一致
2016-04-27 15:45:45.373 多线程二[3119:366879] <NSThread: 0x7fe709604fc0>{number = 1, name = main} i------htwj43oir2016-04-27 15:45:45.373 多线程二[3119:366967] <NSThread: 0x7fe70b200430>{number = 5, name = (null)} ioierje-------+++++wr5htwj43oir2016-04-27 15:45:45.373 多线程二[3119:366960] <NSThread: 0x7fe70b1a14c0>{number = 2, name = (null)} fgggfhg---------2016-04-27 15:45:45.373 多线程二[3119:366961] <NSThread: 0x7fe709507000>{number = 4, name = (null)} blockOperation2016-04-27 15:45:45.373 多线程二[3119:366964] <NSThread: 0x7fe709400280>{number = 3, name = (null)} ioierjewr5htwj43oir
0 0
- iOS开发--多线程编程(三)NSOperation
- iOS多线程编程(三)------ NSOperation
- iOS 多线程(三)NSOperation
- iOS 多线程(三)NSOperation
- iOS多线程编程--NSOperation
- IOS多线程编程 - NSOperation
- IOS开发 - 多线程 NSOperation
- iOS多线程学习之NSOperation(三)
- iOS开发多线程NSOperation(四)
- iOS-NSOperation多线程编程详解
- iOS多线程编程之NSOperation
- iOS多线程编程之NSOperation
- iOS 多线程编程之NSOperation
- iOS开发探索-多线程(NSThread、NSOperation、GCD)编程浅谈
- IOS多线程开发之NSOperation
- iOS开发多线程-自定义NSOperation
- iOS开发 - 多线程之NSOperation
- iOS多线程开发之NSOperation
- 尖端的团队——从这里起航
- iOS 动画中 点击事件
- insert 的三种批量操作语句
- Android学习 游戏开发之打地鼠(终)(五,排行榜和游戏音效)
- python中xrange简
- iOS开发--多线程编程(三)NSOperation
- linux redis安装
- ViewPager无限自动轮播+动画
- MySQL不存在则创建数据库数据表
- 蓝牙聊天工具
- iOS开发工具集合
- 2015级C++第10、11周程序阅读(补充) 继承和派生
- centos7之lnmp安装
- To The Max