iOS -- 多线程之NSOperation
2016-08-05 12:04
405 查看
NSOperation相关使用介绍
NSOperation相关使用介绍NSOperation 一一 基础使用
NSOperation 一一 基础使用
@implementation ViewController #pragma mark - 懒加载 - (NSOperationQueue *)quque{ if (_quque == nil) { _quque = [[NSOperationQueue alloc] init]; } return _quque; } #pragma mark - 基本概念 //1.两个核心概念 //a.操作(NSOperation):想要做的事情 //NSOperation是抽象类,不能直接使用它去创建对象,要使用它的子类(NSInvocationOperation\NSBlockOperation) //b.队列(NSOperationQueue):存放操作的容器 //2.步骤 //a.创建一个队列 //b.创建一个操作 //c.将操作添加到队列中 //操作添加到队列中以后,系统会自动将操作取出来,放到新的线程中执行 #pragma mark - UITouch - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ [self test7]; } #pragma mark - 高级操作 //依赖关系 //如果希望操作A在操作B执行完后再执行,需要依赖关系;让操作A依赖操作B - (void)test7{ //1.创建两个操作 NSBlockOperation * operationA = [NSBlockOperation blockOperationWithBlock:^{ [self longtimeOperation:@10]; }]; NSBlockOperation * operationB = [NSBlockOperation blockOperationWithBlock:^{ [self longtimeOperation:@20]; }]; //操作B结束后会调用CompletionBlock blcok [operationB setCompletionBlock:^{ NSLog(@"操作B结束"); NSLog(@"++:%@", [NSThread currentThread]); }]; //2.添加依赖关系 //让操作A依赖操作B(操作B执行结束后才执行操作A) //注意:1.先添加依赖关系,再将操作放到队列中 2.添加依赖关系的时候不能有循环依赖(也不能相互依赖) [operationA addDependency:operationB]; //3.将两个操作添加到队列中 [self.quque addOperations:@[operationB, operationA] waitUntilFinished:NO]; } //取消队列(将队列中操作销毁,没有办法在复原) //已经从队列中取出来的操作,没有办法取消 - (IBAction)cancel:(id)sender { //取消队列中所有的任务 [self.quque cancelAllOperations]; } //队列暂停/恢复 - (IBAction)suspend:(id)sender { static int i = 0; UIButton * btn = (UIButton *)sender; //第一次点击就暂停 if (i == 0) { i = 1; [btn setTitle:@"恢复" forState:UIControlStateNormal]; //让队列暂停(系统暂停从队列总取出操作,放到线程中执行;但是队列暂停之前已经从队列取出来的操作会继续执行) [self.quque setSuspended:YES]; }else{ i = 0; [btn setTitle:@"暂停" forState:UIControlStateNormal]; //恢复队列 [self.quque setSuspended:NO]; } } #pragma mark - 最大并发数 - (void)test6{ //使用NSOperation结合NSOperationQueue实现的多线程,是异步并发的 //最大并发数指,当前这个队列中,一次可以同时执行的操作数的最大值(最多可以同时执行的操作)---间接的在控制线程数 //一般设置为2-3 self.quque.maxConcurrentOperationCount = 3; for (int i = 0; i < 20; i++) { [self.quque addOperationWithBlock:^{ [self longtimeOperation:[NSNumber numberWithInt:i]]; }]; } } #pragma mark - !!!线程间通信 - (void)test5{ [self.quque addOperationWithBlock:^{ NSLog(@"1:%@", [NSThread currentThread]); //在子线程中下载json数据 NSURL * url = [NSURL URLWithString:@"http://yuting.local/shareX/qiushi.json"]; NSData * data = [NSData dataWithContentsOfURL:url]; NSDictionary * dcit = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; //将字典传回主线程 //拿到主队列,在主队列中添加操作(这个主队列和GCD中的主队列是一样) [[NSOperationQueue mainQueue] addOperationWithBlock:^{ NSLog(@"2:%@", [NSThread currentThread]); NSLog(@"%@",dcit); }]; }]; } #pragma mark - NSOperation的基本使用 //使用NSBlockOperation更简单的创建一个操作 - (void)test4{ //1.在队列添加一个操作 //block中的 4000 代码段就是需要在子线程中执行的任务 [self.quque addOperationWithBlock:^{ [self longtimeOperation:@4]; }]; } //使用NSBlockOperation简单的创建一个操作 - (void)test3{ //1.创建一个操作 //block中的代码段就是需要在子线程中执行的任务 NSBlockOperation * operation = [NSBlockOperation blockOperationWithBlock:^{ [self longtimeOperation:@10]; }]; //2.将操作添加到队列中 [self.quque addOperation:operation]; } //创建多个NSInvocationOperation操作 - (void)test2{ for (int i = 0; i < 10; i++) { //1.创建操作 NSInvocationOperation * operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(longtimeOperation:) object:[NSNumber numberWithInt:i]]; //2.将操作放到队列中(多次调用addOperation方法可以将多个操作添加到队列中) [self.quque addOperation:operation]; } } //创建一个NSInvocationOperation操作 - (void)test1{ //1.创建一个队列 NSOperationQueue * queue = [[NSOperationQueue alloc] init]; //2.创建一个操作 //参数1:效应消息的对象 //参数2:消息(需要在子线程中执行的任务) //参数3:消息的实参 NSInvocationOperation * operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(longtimeOperation:) object:@1]; //3.将操作添加到队列中 [queue addOperation:operation]; } #pragma mark - 耗时操作 - (void)longtimeOperation:(NSNumber *)i{ sleep(3); NSLog(@"%@%@", [NSThread currentThread], i); } @end
相关文章推荐
- ios多线程开发——nsoperation详解
- iOS多线程编程之NSOperation和NSOperationQueue的使用
- iOS多线程编程之NSOperation和NSOperationQueue的使用
- iOS多线程的初步研究(六)-- NSOperation
- 【OC】IOS多线程之NSoperation和GCD的比较
- IOS_1,ios多线程使用:NSThread和NSOperation异步加载图片
- iOS多线程之NSOperation和NSOperationQueue的使用
- iOS多线程编程之NSOperation和NSOperationQueue的使用
- iOS多线程编程之NSOperation和NSOperationQueue的使用
- iOS多线程编程之NSOperation和NSOperationQueue的使用
- IOS多线程编程之NSOperation和NSOperationQueue的使用
- IOS多线程之NSThread、NSOperation、NSInvocationOperation
- IOS 多线程 NSOperation
- IOS学习笔记50--多线程之NSOperation
- iOS多线程编程之NSOperation和NSOperationQueue的使用
- IOS学习笔记23—多线程之NSThread、NSOperation、NSInvocationOperation
- iOS多线程编程之NSOperation和NSOperationQueue的使用
- IOS学习笔记23—多线程之NSThread、NSOperation、NSInvocationOperation
- IOS多线程(NSOperation,NSOperationQueue)
- iOS多线程编程之NSOperation和NSOperationQueue的使用