zoukankan      html  css  js  c++  java
  • 源码0502-02-了解-NSOperation基本使用

    使用NSOperation子类的方式有3种
    NSInvocationOperation
    NSBlockOperation
    自定义子类继承NSOperation,实现内部相应的方法

    //  ViewController.m
    //  02-了解-NSOperation基本使用
    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        [self blockOperation];
    }
    
    - (void)blockOperation
    {
        NSBlockOperation *op = [NSBlockOperation blockOperationWithBlock:^{
            // 在主线程
            NSLog(@"下载1------%@", [NSThread currentThread]);
        }];
        
        // 添加额外的任务(在子线程执行)
        [op addExecutionBlock:^{
            NSLog(@"下载2------%@", [NSThread currentThread]);
        }];
    
        [op addExecutionBlock:^{
            NSLog(@"下载3------%@", [NSThread currentThread]);
        }];
        [op addExecutionBlock:^{
            NSLog(@"下载4------%@", [NSThread currentThread]);
        }];
        
        [op start];
    }
    
    - (void)invocationOperation
    {
        NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(run) object:nil];
    
        [op start];
    }
    
    - (void)run
    {
        NSLog(@"------%@", [NSThread currentThread]);
    }
    
    @end
    //  ViewController.m
    //  03-掌握-NSOperationQueue
    #import "ViewController.h"
    #import "XMGOperation.h"
    
    @interface ViewController ()
    /** 队列 */
    @property (nonatomic, strong) NSOperationQueue *queue;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        // 创建队列
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        
        // 设置最大并发操作数
    //    queue.maxConcurrentOperationCount = 1; // 就变成了串行队列
    //    
    //    // 添加操作
    //    [queue addOperationWithBlock:^{
    ////        NSLog(@"download1 --- %@", [NSThread currentThread]);
    ////        [NSThread sleepForTimeInterval:1.0];
    //        for (NSInteger i = 0; i<5000; i++) {
    //            NSLog(@"download1 -%zd-- %@", i, [NSThread currentThread]);
    //        }
    //    }];
    //    [queue addOperationWithBlock:^{
    ////        NSLog(@"download2 --- %@", [NSThread currentThread]);
    //        //        [NSThread sleepForTimeInterval:1.0];
    //        for (NSInteger i = 0; i<1000; i++) {
    //            NSLog(@"download2 --- %@", [NSThread currentThread]);
    //        }
    //    }];
    //    [queue addOperationWithBlock:^{
    ////        NSLog(@"download3 --- %@", [NSThread currentThread]);
    ////        [NSThread sleepForTimeInterval:1.0];
    //        for (NSInteger i = 0; i<1000; i++) {
    //            NSLog(@"download3 --- %@", [NSThread currentThread]);
    //        }
    //    }];
        
        [queue addOperation:[[XMGOperation alloc] init]];
        
        self.queue = queue;
    }
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    //    if (self.queue.isSuspended) {
    //        // 恢复队列,继续执行
    //        self.queue.suspended = NO;
    //    } else {
    //        // 暂停(挂起)队列,暂停执行
    //        self.queue.suspended = YES;
    //    }
        
        [self.queue cancelAllOperations];
    }
    
    - (void)opetationQueue3
    {
        // 创建队列
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        
        // 设置最大并发操作数
        //    queue.maxConcurrentOperationCount = 2;
        queue.maxConcurrentOperationCount = 1; // 就变成了串行队列
        
        // 添加操作
        [queue addOperationWithBlock:^{
            NSLog(@"download1 --- %@", [NSThread currentThread]);
            [NSThread sleepForTimeInterval:0.01];
        }];
        [queue addOperationWithBlock:^{
            NSLog(@"download2 --- %@", [NSThread currentThread]);
            [NSThread sleepForTimeInterval:0.01];
        }];
        [queue addOperationWithBlock:^{
            NSLog(@"download3 --- %@", [NSThread currentThread]);
            [NSThread sleepForTimeInterval:0.01];
        }];
        [queue addOperationWithBlock:^{
            NSLog(@"download4 --- %@", [NSThread currentThread]);
            [NSThread sleepForTimeInterval:0.01];
        }];
        [queue addOperationWithBlock:^{
            NSLog(@"download5 --- %@", [NSThread currentThread]);
            [NSThread sleepForTimeInterval:0.01];
        }];
        [queue addOperationWithBlock:^{
            NSLog(@"download6 --- %@", [NSThread currentThread]);
            [NSThread sleepForTimeInterval:0.01];
        }];
    }
    
    - (void)operationQueue2
    {
        // 创建队列
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        
        // 创建操作
        //    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        //        NSLog(@"download1 --- %@", [NSThread currentThread]);
        //    }];
        
        // 添加操作到队列中
        //    [queue addOperation:op1];
        [queue addOperationWithBlock:^{
            NSLog(@"download1 --- %@", [NSThread currentThread]);
        }];
        [queue addOperationWithBlock:^{
            NSLog(@"download2 --- %@", [NSThread currentThread]);
        }];
    }
    
    - (void)operationQueue1
    {
        // 创建队列
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        
        // 创建操作(任务)
        // 创建NSInvocationOperation
        NSInvocationOperation *op1 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download1) object:nil];
        NSInvocationOperation *op2 = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(download2) object:nil];
        
        // 创建NSBlockOperation
        NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"download3 --- %@", [NSThread currentThread]);
        }];
        
        [op3 addExecutionBlock:^{
            NSLog(@"download4 --- %@", [NSThread currentThread]);
        }];
        [op3 addExecutionBlock:^{
            NSLog(@"download5 --- %@", [NSThread currentThread]);
        }];
        
        
        NSBlockOperation *op4 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"download6 --- %@", [NSThread currentThread]);
        }];
        
        // 创建XMGOperation
        XMGOperation *op5 = [[XMGOperation alloc] init];
        
        // 添加任务到队列中
        [queue addOperation:op1]; // [op1 start]
        [queue addOperation:op2]; // [op2 start]
        [queue addOperation:op3]; // [op3 start]
        [queue addOperation:op4]; // [op4 start]
        [queue addOperation:op5]; // [op5 start]
    }
    
    - (void)download1
    {
        NSLog(@"download1 --- %@", [NSThread currentThread]);
    }
    
    - (void)download2
    {
        NSLog(@"download2 --- %@", [NSThread currentThread]);
    }
    @end
    04-掌握-操作依赖
    //
    //  ViewController.m
    //  04-掌握-操作依赖
    #import "ViewController.h"
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        
        NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"download1----%@", [NSThread  currentThread]);
        }];
        NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"download2----%@", [NSThread  currentThread]);
        }];
        NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"download3----%@", [NSThread  currentThread]);
        }];
        NSBlockOperation *op4 = [NSBlockOperation blockOperationWithBlock:^{
            for (NSInteger i = 0; i<10; i++) {
                NSLog(@"download4----%@", [NSThread  currentThread]);
            }
        }];
        NSBlockOperation *op5 = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"download5----%@", [NSThread  currentThread]);
        }];
        op5.completionBlock = ^{
            NSLog(@"op5执行完毕---%@", [NSThread currentThread]);
        };
        
       // 设置依赖
        [op3 addDependency:op1];
        [op3 addDependency:op2];
        [op3 addDependency:op4];
        
        [queue addOperation:op1];
        [queue addOperation:op2];
        [queue addOperation:op3];
        [queue addOperation:op4];
        [queue addOperation:op5];
    }
    
    @end
    05-掌握-线程间的通信
    //  ViewController.m
    //  05-掌握-线程间的通信
    #import "ViewController.h"
    
    @interface ViewController ()
    @property (weak, nonatomic) IBOutlet UIImageView *imageView;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
    }
    
    - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        NSOperationQueue *queue = [[NSOperationQueue alloc] init];
        
        __block UIImage *image1 = nil;
        // 下载图片1
        NSBlockOperation *download1 = [NSBlockOperation blockOperationWithBlock:^{
            
            // 图片的网络路径
            NSURL *url = [NSURL URLWithString:@"http://img.pconline.com.cn/images/photoblog/9/9/8/1/9981681/200910/11/1255259355826.jpg"];
            
            // 加载图片
            NSData *data = [NSData dataWithContentsOfURL:url];
            
            // 生成图片
            image1 = [UIImage imageWithData:data];
        }];
        
        __block UIImage *image2 = nil;
        // 下载图片2
        NSBlockOperation *download2 = [NSBlockOperation blockOperationWithBlock:^{
            
            // 图片的网络路径
            NSURL *url = [NSURL URLWithString:@"http://pic38.nipic.com/20140228/5571398_215900721128_2.jpg"];
    
            
            // 加载图片
            NSData *data = [NSData dataWithContentsOfURL:url];
            
            // 生成图片
            image2 = [UIImage imageWithData:data];
        }];
        
        // 合成图片
        NSBlockOperation *combine = [NSBlockOperation blockOperationWithBlock:^{
            // 开启新的图形上下文
            UIGraphicsBeginImageContext(CGSizeMake(100, 100));
            
            // 绘制图片
            [image1 drawInRect:CGRectMake(0, 0, 50, 100)];
            image1 = nil;
            
            [image2 drawInRect:CGRectMake(50, 0, 50, 100)];
            image2 = nil;
            
            // 取得上下文中的图片
            UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
            
            // 结束上下文
            UIGraphicsEndImageContext();
            
            // 回到主线程
            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                self.imageView.image = image;
            }];
        }];
        [combine addDependency:download1];
        [combine addDependency:download2];
        设置完依赖在放到队列中
        [queue addOperation:download1];
        [queue addOperation:download2];
        [queue addOperation:combine];
    }
    
    /**
     * 线程之间的通信
     */
    - (void)test
    {
        [[[NSOperationQueue alloc] init] addOperationWithBlock:^{
            // 图片的网络路径
           NSURL *url = [NSURL URLWithString:@"http://img.pconline.com.cn/images/photoblog/9/9/8/1/9981681/200910/11/1255259355826.jpg"];
         
            
            // 加载图片
            NSData *data = [NSData dataWithContentsOfURL:url];
            
            // 生成图片
            UIImage *image = [UIImage imageWithData:data];
            
            // 回到主线程
            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                self.imageView.image = image;
            }];
        }];
    }
    
    @end
    本人无商业用途,仅仅是学习做个笔记,特别鸣谢小马哥,学习了IOS,另日语学习内容有需要文本和音频请关注公众号:riyuxuexishuji
  • 相关阅读:
    SQL_TRACE与tkprof分析
    mysql学习之-三种安装方式与版本介绍
    1400
    输出二叉树中所有从根结点到叶子结点的路径
    [置顶] 处世悬镜之舍之
    Azkaban2配置过程
    [置顶] 处世悬镜之舍之 二
    UVALIVE 5893 计算几何+搜索
    Paxos算法 Paxos Made Simple
    Spring AOP 详解
  • 原文地址:https://www.cnblogs.com/laugh/p/6565425.html
Copyright © 2011-2022 走看看