zoukankan      html  css  js  c++  java
  • NSOperation的多线程

    NSOperation基于GCD的封装,使用的步骤和GCD相似,①创建队列 ②封装操作任务。

    NSOperation有两种队列:

    主队列: 

    NSOperationQueue *queue = [NSOperationQueue mainQueue];

     

    自定义队列(就是并发队列):

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

     

     

    使用的第二步:封装操作任务

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

     

    第三步: 将任务添加到队列中

    [queue addOperation:op1];// 这一步内部会自动调动 [op1 start],将任务开始。

     

    代码示例:

    -(void)invocationWithQueue

    {

        //创建队列

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

        //封装操作

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

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

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

        

        //将任务添加到队列

        [queue addOperation:op1];

        [queue addOperation:op2];

        [queue addOperation:op3];

     

        

    }

     

    封装操作任务的第二种方法:

      NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{

            

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

        }];

     

    NSBlockOperation的代码示例:

    -(void)invocationBlockWithQueue

    {

        //创建队列

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

        //封装操作

        NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{

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

        }];

        NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{

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

        }];

        NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{

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

        }];

     

      [op1 addExecutionBlock:^{

            NSLog(@"这是追加的任务");

        }];

     

    //设置最大并发数

        queue.maxConcurrentOperationCount = 1;

        //将任务添加到队列

        [queue addOperation:op1];

        [queue addOperation:op2];

        [queue addOperation:op3];

    }

     

    注意:设置最大并发数 并不能决定开几条线程,只能决定任务的执行顺序。 最大并发数不能控制追加任务的执行顺序。

     

    设置队列暂停 

    [self.queue setSuspended:YES]; 设置暂停 不能立即停止正在执行的任务, 只能停止正在执行操作后面的操作。当前任务不可分割,必须执行完毕。

     

    恢复队列

    [self.queue setSuspended:NO];

     

    取消所有的操作

    [self.queue cancelAllOperations]; 只能取消队列中处于等待状态的操作,正在执行的操作不会取消。

  • 相关阅读:
    无语的index hint:手工分配哈希区,5小时不出结果,优化后20分钟
    EL 表达式中自己定义函数
    关于SetCapture() 和 ReleaseCapture()的使用方法
    MySql的like语句中的通配符:百分号、下划线和escape
    字符串匹配之horspool算法(简化的BM算法)
    strcmp函数和strcpy函数
    ehci符合USB2.0,uhci,ohci,
    软件发布版本区别介绍-Alpha,Beta,RC,Release
    Wi-Fi定位,AP定位
    CentOS 启动提示unexpected inconsistency;RUN fsck MANUALLY, ntfs的input/output Error,InPageError c000009c使用chkdsk修复磁盘,12款Linux系统恢复工具
  • 原文地址:https://www.cnblogs.com/dashengios/p/10420800.html
Copyright © 2011-2022 走看看