iOS -- 多线程之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中的代码段就是需要在子线程中执行的任务
    [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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值