代码改变世界

NSOperation(多线程)2

2015-10-16 05:04  真实16  阅读(188)  评论(0编辑  收藏  举报

//

//  ViewController.m

//  UI-NO.25多线程-2

//

//  Created by Bruce on 15/8/26.

//  Copyright (c) 2015年 Bruce. All rights reserved.

//

/*

 NSOperation 是一个 基类 (抽象类) 不能直接使用 必须使用他的子类

 他默认是在 当前线程 进行操作   如果单独使用NSOperation 必须手动启动

 常与NSOperationQueue一起使用   在与NSOperationQueue一起使用 会自动开辟线程 进行操作   不用手动启动

 

 

 NSOperation 系统提供了两个子类:NSInvocationOperation ,NSBlockOperation

 自定义的子类

 

 

 

 

 NSOperation类是用来封装与单个任务相关的代码和数据的抽象类,因为它是抽象的,你不能够直接使用这个类,而是继承或使用的系统定义的子类( NSInvocationOperation或NSBlockOperation )之一来执行实际任务

 

 能够以并发或非并发的方式执行这个操作

 NSOperation调用start方法即可开始执行操作

 

 

 1、使用定义好的两个子类:NSInvocationOperation 和 NSBlockOperation

 2、使用自定义的NSOperation的子类

 

 NSBlockOperation 操作数大于1  也会开辟线程去执行操作

 

 单一使用Operation他是同步执行

 

 

 

 

 NSInvocationOperation  是在当前线程去进行一个操作

 NSBlockOperation 也是在当前线程去执行一个操作,在使用addExecutionBlock添加一个操作的时候(操作数>1) 会在其他线程并发执行操作

 

 NSOperationQueue线程队列 把Operation放在队列里面  可以使用线程队列 管理线程 使线程并发执行

 maxConcurrentOperationCount 设置线程的最大并发数  默认是-1 没有限制  这样会同时运行队列中的全部的操作

 并发数  是同时执行任务的数量

 尽量在5以内 否则  也会对主线程 有所影响

 

 //    NSOperationQueue的作⽤:NSOperation可以调⽤start⽅法来执⾏任务,但默认是同步执行的

 //    如果将NSOperation添加到NSOperationQueue(操作队列)中,系统会自动异步执行NSOperation中的操作

 //    添加操作到NSOperationQueue中,自动执行操作,自动开启线程

 

 */

#import "ViewController.h"

#import "DownLoadOperation.h"

 

@interface ViewController ()

{

    int curTicketNum;

    

}

@end

 

@implementation ViewController

 

 

 

- (void)viewDidLoad {

    [super viewDidLoad];

    curTicketNum = 100;

//    会在当前线程执行

    NSInvocationOperation *invocation = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(doSome:) object:@"111"];

//    [invocation start];

    

    NSInvocationOperation *invocation1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(doSome:) object:@"222"];

//    [invocation1 start];

    

    NSInvocationOperation *invocation2 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(doSome:) object:@"333"];

//    [invocation2 start];

    

 

    

//    操作数>1 会并发操作

    NSBlockOperation *block = [NSBlockOperation blockOperationWithBlock:^{

        NSLog(@"block111");

        [self doSome:@"block111"];

    }];

 

    

    [block addExecutionBlock:^{

        NSLog(@"block222");

        [self doSome:@"block222"];

    }];

    

    [block addExecutionBlock:^{

        NSLog(@"block333");

        [self doSome:@"block333"];

    }];

    

    [block addExecutionBlock:^{

        NSLog(@"block444");

        [self doSome:@"block444"];

    }];

    

//    [block start];

    

    

    DownLoadOperation *myOP = [[DownLoadOperation alloc]initWithLoadImageURLString:@"http://image.tianjimedia.com/uploadImages/2012/273/M6J97CZGYA4Z_NatGeo01_250.jpg"];

    

    

//    线程队列

//    NSOperationQueue的作⽤:NSOperation可以调⽤start⽅法来执⾏任务,但默认是同步执行的

//    如果将NSOperation添加到NSOperationQueue(操作队列)中,系统会自动异步执行NSOperation中的操作

//    添加操作到NSOperationQueue中,自动执行操作,自动开启线程

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

    queue.maxConcurrentOperationCount = 1;

    [queue addOperation:invocation];

    [queue addOperation:invocation1];

    [queue addOperation:invocation2];

    [queue addOperation:block];

    [queue addOperation:myOP];

}

 

- (void)doSome:(id)sender

{

    NSLog(@"Invocatio%@",sender);

  

}

 

- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}

 

@end