• 多线程 NSOpeartion 的使用


    NSOperation简介

    相对于 GCD ,具有面向对象的特征,比 GCD 更简单易用,代码可读性强

    NSOperatioin 单独使用时, 不具有开辟新线程的能力, 只是同步执行操作, 需要配合 NSOpeationQueue 来实现多线程操作

    //验证: 没有队列时, 同步执行

    //子类 NSBlockOperation

    //NSBlockOperation还提供了一个方法addExecutionBlock:

    //额外添加 block 任务

    - (void)blockOperation{

        NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{

            NSLog(@"------%@", [NSThread currentThread]);

     

        }];

        

        // 添加额外的任务(在子线程执行)

        [op addExecutionBlock:^{

            NSLog(@"2------%@", [NSThread currentThread]);

        }];

        [op addExecutionBlock:^{

            NSLog(@"3------%@", [NSThread currentThread]);

        }];

        [op addExecutionBlock:^{

            NSLog(@"4------%@", [NSThread currentThread]);

        }];

     

        

        //直接执行,没有放到 queue ,不会开启新线程,在主线程中执行

        [op start];

        

    }

    一.使用步骤:

    1.创建队列

    2.创建任务

    3.将任务添加到队列中(异步执行, 开启新线程)

    //任务 添加 到队列中

    //在队列中 开启新线程

    - (void)addTaskToQueue{

        //1.创建队列

        NSOperationQueue *queue = [[NSOperationQueue alloc]init];

        // 2. 创建操作

        // 创建NSInvocationOperation

        NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];

        // 创建NSBlockOperation

        NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{

            for (int i = 0; i < 2; ++i) {

                NSLog(@"2-----%@", [NSThread currentThread]);

            }

        }];

        

        

        //--添加依赖

        //2 依赖1 ,则必须 1 完成之后,才会执行2

        [op2 addDependency:op1];

        

        //--设置最大并发数

    //    queue.maxConcurrentOperationCount = 1; 只能同时执行 1 个任务,变成了串行队列

        queue.maxConcurrentOperationCount = 2;

     

        

      

        //3.将任务添加到队列中

        [queue addOperation:op1];

        [queue addOperation:op2];

     

        //4.不需要创建任务,queueu直接添加 block 任务

        [queue addOperationWithBlock:^{

            for (int i = 0; i < 2; ++i) {

                NSLog(@"3-----%@", [NSThread currentThread]);

            }

        }];

        

        

        

        

    }

    二.特性方法

    1.任务之间可以添加依赖

    //--添加依赖

        //2 依赖1 ,则必须 1 完成之后,才会执行2

        [op2 addDependency:op1];

        

    2.队列可以设置最大并发数

        //--设置最大并发数

    //    queue.maxConcurrentOperationCount = 1; 只能同时执行 1 个任务,变成了串行队列

        queue.maxConcurrentOperationCount = 2;

    三.其他方法

    • - (void)cancel; NSOperation提供的方法,可取消单个操作
    • - (void)cancelAllOperations; NSOperationQueue提供的方法,可以取消队列的所有操作
    • - (void)setSuspended:(BOOL)b; 可设置任务的暂停和恢复,YES代表暂停队列,NO代表恢复队列
    • - (BOOL)isSuspended; 判断暂停状态

    注意: 暂停 和 取消 并不代表可以将当前的操作 立即取消或暂停, 而是将当前的操作执行完成之后, 不再执行其他的新操作了

    暂停与取消的 区别: 是否可以继续向下执行

  • 相关阅读:
    Deep Learning ——Yann LeCun,Yoshua Bengio&Geoffrey Hinton
    numpy模块
    损失函数、正则化、优化
    最近邻分类器,K近邻分类器,线性分类器
    python json,pickle模块
    python os,sys模块
    python random模块
    到2030年,人工智能会发展成什么样?
    AI的偏见:机器就是绝对理性的么?
    5G和AI:现在和未来的互补技术
  • 原文地址:https://www.cnblogs.com/daxueshan/p/7205030.html
Copyright © 2020-2023  润新知