iOS开发--多线程编程(三)NSOperation
2016-04-27 15:45
477 查看
NSOperation是一个基类(抽象类)不能直接使用,必须使用他的子类它默认是在当前线程进行操作如果单独使用NSOperation必须手动启动常与 NSOperationQueue一起使用。在与NSOperationQueue一起使用会自动开辟线程进行操作不用手动启动NSOperation系统提供的两个子类NSInvocation ,NSBlockOperation1,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] 555555555552,使用 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
相关文章推荐
- NSNotification
- IOS 绘图实战之“图片添加文字或者水印”
- //设置键盘移动位置 一般用于适配
- iOS开发之const
- iOS 开发工具集合
- iOS开发工具集合
- iOS 动画中 点击事件
- IOS 写一个整洁易用的tableView
- iOS开发——iOS7(及以后版本) SDK自带二维码(含条形码)扫码、二维码生成
- iOS每日一记之——————————iOS 开发工具集合
- IOS 成员变量,全局变量,局部变量定义,static与extern的区别
- iOS Xcode, 解决“Could not insert new outlet connection”的问题。
- 《Motion Design for iOS》(四)
- OpenCV For iOS 1: 连接OpenCV 3.0
- 爱萌即时通讯使用 - Other linker flags设置
- iOS 延迟执行的方法总结
- 灵活式的collectionview的header
- iOS MD5加密算法
- iOS最新极光推送详解
- 字符串与数组的相互转化