zoukankan      html  css  js  c++  java
  • NSoperation用法详解及与GCD的比较

    NSInvocationOperation

    // 基于一个对象和selector来创建操作。如果你已经有现有的方法来执行需要的任务,就可以使用这个类


       
        NSInvocationOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downImage) object:nil];
       
        // 如果我们想在一个NSOperation执行完毕后做一些事情,就调用NSOperation的setCompletionBlock方法来设置想做的事情
        [op setCompletionBlock:^{
            NSLog(@"完成");
        }];
       
        //    2.开始执行任务(同步执行)
       
        // 一个NSOperation对象可以通过调用start方法来执行任务,默认是同步执行的。

        [op start];

     NSBlockOperation

     //  能够并发地执行一个或多个block对象,所有相关的block都执行完之后,操作才算完成
        NSBlockOperation * op = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"%@",[NSThread currentThread]);
            
            NSLog(@"第一个操作");
        }];
        
        // 通过addExecutionBlock方法添加block操作,开启多个线程,三个线程
        [op addExecutionBlock:^{
            
            NSLog(@"%@",[NSThread currentThread]);
            
            NSLog(@"第二个操作");
        }];
        
        [op addExecutionBlock:^{
            
            NSLog(@"%@",[NSThread currentThread]);
            
            NSLog(@"第三个操作");
        }];
        
        [op start];

    NSOperationQueue-   一个操作序列

    //NSOperation是基于GCD的,把GCD的block封装成opertion,NSOperationQueue是全局队列封装
        //将NSOperation添加到一个NSOperationQueue(操作队列)中去执行,而且是异步执行的。
       
        //创建一个操作队列
        NSOperationQueue * queue = [[NSOperationQueue alloc] init];
       
        NSInvocationOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downImage) object:nil];
       
        NSBlockOperation * op2 = [NSBlockOperation blockOperationWithBlock:^{
           
            NSLog(@"op2 - %@",[NSThread currentThread]);
        }];
       
        //添加NSOperation到NSOperationQueue中
        //NSOperation添加到queue之后,通常短时间内就会得到运行。
        //    [queue addOperation:op];
        //    [queue addOperation:op2];
       
        //    waitUntilFinished yes 操作完成后执行下面的代码 no 先执行下面的代码
       
        //添加一个block形式的operation
        [queue addOperationWithBlock:^{
           
            NSLog(@"op3 - %@",[NSThread currentThread]);
           
        }];
       
        [queue addOperations:@[op,op2] waitUntilFinished:NO];
        

        //最大并发数,这个功能NSOperation比较常用
       
        queue.maxConcurrentOperationCount = 2;
       
        for (NSInteger i = 0; i < 10; i++) {
           
            NSInvocationOperation * op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downImage) object:nil];
           
            [queue addOperation:op];
        }
     

    NSOperationQueue的依赖关系

     self.queue = [[NSOperationQueue alloc] init];
        
        NSInvocationOperation * op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(downImage) object:nil];
        //设置优先级,数据量少看不出
        op1.queuePriority = -4;

        
        NSBlockOperation * op2 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"解压图片包");
        }];
        op2.queuePriority = 0;

        
        NSBlockOperation * op3 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"观看漫画");
        }];
        op3.queuePriority = 4;
        
        //添加NSOperation的依赖对象
    //    [op2 addDependency:op1];
    //    [op3 addDependency:op2];
        
        //注意:不能创建环形依赖,如A依赖B,B依赖A,这是错误的
        //    [op1 addDependency:op3];
        
        [self.queue addOperations:@[op1,op2,op3] waitUntilFinished:YES];

         //挂起状态
        self.queue.suspended = !self.queue.suspended;
    // 不过暂停一个queue不会导致正在执行的operation在任务中途暂停,只是简单地阻止调度新Operation执行。

    // 取消queue中所有的操作
        [self.queue cancelAllOperations];

     //NSOperation 线程之间的通信

        [self.queue addOperationWithBlock:^{
           
            NSLog(@"%@",[NSThread currentThread]);
            NSLog(@"下载图片");
           
            //获取主队列
            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
               
                NSLog(@"%@",[NSThread currentThread]);
                NSLog(@"更新UI");
               
            }];
        }];
     

    NSOperation与GCD的区别

    /**
     *  GCD -- (iOS4.0)多线程解决方案
        将任务(block)添加到队列(串行,并行(全局队列)),指定执行任务的方法。(同步,异步)
        拿到dispatch_get_main_queue,线程之间的通信

     
        NSOperation -- (iOS2.0)  (后经苹果改造)
     
        将操作添加到队列里
        [NSOperationQueue mainQueue]  获取主队列,将任务添加到主队列,就会在主线程中执行
        NSOperation可以设置最大并发数(用GCD处理,比较麻烦)
        可以暂停可以继续,也就是挂起操作
        取消所有的任务
        设置依赖关系
     */
     

    您的资助是我最大的动力!
    金额随意,欢迎来赏!

    如果,您认为阅读这篇博客让您有些收获,不妨点击一下右下角的推荐按钮。
    如果,您希望更容易地发现我的新博客,不妨点击一下绿色通道的关注我

    如果,想给予我更多的鼓励,求打

    因为,我的写作热情也离不开您的肯定支持,感谢您的阅读,我是【往事亦如风】!

  • 相关阅读:
    读取Web.config文件中的配置信息类
    屏蔽页面中的右键操作
    树型目录
    自己常用的分页SQL
    c#用一个线程同步的简单例子

    c++面向对象学习
    数据上传项目总结
    简单的xml学习
    c#中跨线程使用控件
  • 原文地址:https://www.cnblogs.com/ldnh/p/5281084.html
Copyright © 2011-2022 走看看