NSOperation 代码,阐述NSOperation一般功能和重要功能

//
//  ViewController.m
//  05-NSOperation
//
//  Created by jerry on 15/9/5.
//  Copyright (c) 2015年 jerry. All rights reserved.
//


/**
 
 开发的时候看自己的需求,根据下面的各个优势,
 
GCD---IOS4.0
 - 将任务(block)添加到队列(串行/并发(全局))指定执行任务的方法(同步(阻塞)/异步)
 - 拿到dispatch_get_main_queue()拿到主队列  线程之间的通信
 - NSOperation无法做到的,一次性执行、延迟执行、调度组(NSOperation相对复杂)
 
NSOperation--IOS 2.O
 - 将操作(异步执行)添加到队列(并发/全局)
 - [NSOperationQueue mainQueue] 主队列,任务添加到主队列,就会在主线程执行。
 - 提供了一些GCD不好实现的--最大并发数
 - 暂停/继续    也就是挂起操作
 - 取消所有的任务
 - 依赖关系
 */


/**
 *  小结:
 *  只要是NSOperation的一个子类就能添加到操作队列
    一旦操作添加到队列,就会自动的异步执行
    如果没有添加到队列中 而是使用了start方法,他会在当前线程执行操作。(一般不使用)
    如果要做线程之间的痛惜你,可以使用[NSOperationQueue mainQueue]拿到主队列,往主队列添加操作更新ui
*/
#import "ViewController.h"

@interface ViewController ()
// 负责调度所有的操作  全局队列
@property(nonatomic,strong)NSOperationQueue *opQueue;
@end

@implementation ViewController

-(NSOperationQueue *)opQueue
{
    if (_opQueue==nil) {
        _opQueue = [[NSOperationQueue alloc]init];
    }
    return _opQueue;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [self dependcy];
}


#pragma mark -- 高级操作

// 依赖关系
- (void)dependcy
{
    /**
     例子:
        1.下载小说的压缩包
        2.解压缩 删除压缩包
        3.更新ui
     */
    
    NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"1.下载小说压缩包");
    }];
    NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"2.解压小说压缩包");
    }];
    NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
        NSLog(@"3.删除小说压缩包");
    }];
    
    // 执行任务之间的一个依赖关系
    // 指定任务之间的依赖关系--依赖关系可以跨队列(可以在子线程,到主线程更新ui)
    // op2 依赖op1
    [op2 addDependency:op1];
    // op3 依赖op2
    [op3 addDependency:op2];
    // 注意点:一定不要出现循环依赖关系,
//    [op1addDependency:op3];
    
    // waitUntilFinished:类似于GCD的调度组的通知
    // YES 是等待线程执行完毕,才会执行后边的代码
    // no  是不会等待线程执行完毕,直接执行后边的代码
    [self.opQueue addOperations:@[op1,op2] waitUntilFinished:YES];
    
//    在主线程更新ui
    [[NSOperationQueue mainQueue] addOperation:op3];
    NSLog(@"come here");
}

// MARK  取消所有的队列操作  ,他是取消所有队列的操作。
- (IBAction)cancelAll {
    [self.opQueue cancelAllOperations];
    NSLog(@"取消所有的操作");
    self.opQueue.suspended = NO;
}

// 暂停操作   线程挂起。
- (IBAction)pause {
    //    判断当前队列是否有操作,
    if (self.opQueue.operationCount == 0)
        NSLog(@"当前没有任何操作");
        return;
     
    self.opQueue.suspended = !self.opQueue.suspended;
    if (self.opQueue.suspended) {
        NSLog(@"暂停");
    }else
    {NSLog(@"继续");}

    
}


// 最大并发数
-(void)opDemo5
{
    // 设置最大并发数   默认是-1  所以 我们设置1  其实是有两条线程。
    self.opQueue.maxConcurrentOperationCount = 2;
    for (int i = 0; i < 10; i++) {
      
        NSOperation *op = [NSBlockOperation blockOperationWithBlock:^{
            [NSThread sleepForTimeInterval:2.0];
            NSLog(@"----%@-----%d",[NSThread currentThread],i);
        }];
        [self.opQueue addOperation:op];
    }
}


#pragma mark  --基本使用
/**
 *  线程之间的通信
 */
-(void)opDemo4
{
    // 初始化队列
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    
    [queue addOperationWithBlock:^{
        
        NSLog(@"耗时操作----%@",[NSThread currentThread]);
        // 在住线程更新ui
        [[NSOperationQueue mainQueue]addOperationWithBlock:^{
            NSLog(@"在主线程更新ui------%@",[NSThread currentThread]);
        }];
    }];
}


-(void)opDemo3
{
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    
    for (int i = 0; i < 10; i++) {
        [queue addOperationWithBlock:^{
            NSLog(@"%@---%d",[NSThread currentThread],i);
        }];
    }
}

-(void)opDemo2
{
    // 1.队列--- 相当于GCD的并发队列
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
//    主队列 -- 不会开启新线程,相当于GCD里边的主队列
//    NSOperationQueue *queue = [NSOperationQueue mainQueue];
    
    // 2.多个操作
    for (int i = 0 ; i < 10; i++) {
        NSBlockOperation *opBlock = [NSBlockOperation blockOperationWithBlock:^{
            NSLog(@"%@---%d",[NSThread currentThread],i);
        }];
        // 把block操作放到队列里
        [queue addOperation:opBlock];
    }
    
    
}



-(void)opDemo1
{
    // 1.初始化一个nsoperation
    NSOperation *op = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(downloadImg:) object:@"Invocation"];
    
//    // 2.启动---他是在当前线程执行,
//    [op start];
    
//    实际操作的时候是放到队列中进行的
    NSOperationQueue *queue = [[NSOperationQueue alloc]init];
    // 只要把操作添加到队列,就会自动异步执行调度方法。
    [queue addOperation:op];
}
-(void)downloadImg:(id)obj
{
    NSLog(@"%@----%@",[NSThread currentThread],obj);
}
@end

 

posted @ 2015-09-07 08:34  。低调ヽ继续  阅读(225)  评论(0编辑  收藏  举报