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