• 多线程知识之NSOperation的使用


    /***************创建队列的方式**************/

    1.主队列,凡是添加到主队列中的任务(NSOperation),都会放到主线程中执行

    NSOperationQueue *queue = [NSOperationQueue mainQueue];

    2.其它队列(串行队列、并发队列),添加到这种队列中的任务(NSOperation),就会自动放到子线程中执行

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

    /***************最大并发数(控制线程数量)**************/

    queue.maxConcurrentOperationCount = 2; 

    queue.maxConcurrentOperationCount = 1; // 就变成了串行队列

    最大并发数的相关方法

    - (NSInteger)maxConcurrentOperationCount;

    - (void)setMaxConcurrentOperationCount:(NSInteger)cnt;

    /***************创建操作(任务)**************/

    1.创建NSInvocationOperation

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

    2.创建NSBlockOperation

    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{

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

    }];

    3.添加额外的任务(默认放到子线程执行)

    [op2 addExecutionBlock:^{

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

    }];

    4.自定义MyOperation(继承NSOperation,并且将需要执行的任务放在main方法中)

    MyOperation *op4 = [[MyOperation alloc] init];

    自定义NSOperation的步骤
    重写- (void)main方法,在里面实现想执行的任务
     
    重写- (void)main方法的注意点
    自己创建自动释放池(因为如果是异步操作,无法访问主线程的自动释放池)
    经常通过- (BOOL)isCancelled方法检测操作是否被取消,对取消做出响应

    /***************添加任务到队列(默认会自动开启任务)**************/

    方式一:

    [queue addOperation:op1];

    [queue addOperation:op2];

    [queue addOperation:op3];

    [queue addOperation:op4];

    方式二:

    [queue addOperationWithBlock:^{

            //将操作(任务)放在此处

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

    }];

    /***************暂停队列**************/

    self.queue.suspended = YES;

    - (void)setSuspended:(BOOL)b; // YES代表暂停队列,NO代表恢复队列

    - (BOOL)isSuspended;

    /***************取消队列**************/

    [self.queue cancelAllOperations];

    - (void)cancelAllOperations;

    提示:也可以调用NSOperation的- (void)cancel方法取消单个操作

    /***************操作依赖**************/

    NSOperation之间可以设置依赖来保证执行顺序
    比如一定要让操作A执行完后,才能执行操作B,可以这么写
    [operationB addDependency:operationA]; // 操作B依赖于操作A
    可以在不同queue的NSOperation之间创建依赖关系
    注意:不能相互依赖,操作依赖需要在添加队列之前设置
     
    /***************操作监听**************/
    NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{

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

    }];

    op.completionBlock = ^{

            NSLog(@"op执行完毕---%@", [NSThread currentThread]);

    };

    可以监听一个操作的执行完毕

    - (void (^)(void))completionBlock;

    - (void)setCompletionBlock:(void (^)(void))block;

     
    /***************线程之间的通信**************/

    [[[NSOperationQueue alloc] init] addOperationWithBlock:^{

            // 此处放耗时操作

            // 回到主线程

            [[NSOperationQueue mainQueue] addOperationWithBlock:^{

                self.imageView.image = image;

            }];

    }];

  • 相关阅读:
    与eolinker api集成
    为什么要用eolinker帮助API开发
    什么是Eolinekr
    使用Eolinker加快您的API开发
    java反射
    mybatis-查询过程
    mybatis初始化过程
    mybatis的插件分析
    web.xml中的ContextLoaderListener和DispatcherServlet区别
    css+js杂记
  • 原文地址:https://www.cnblogs.com/wangliang2015/p/5408119.html
Copyright © 2020-2023  润新知