NSOperation
-
NSOperation是个抽象类,不具备封操作的能力,必须使用它的子类
-
使用NSOperation子类的方式有两种
-
NSInvocationOperation
-
NSBlockOperation
-
NSInvocationOperation
NSInvocationOperation *op1 = [[NSInvocationOperation alloc]initWithTarget:self selector:@selector(download1) object:nil];
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
[queue addOperation:op1];
NSBlockOperation *blockOp1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"blockOp1-----%@",[NSThread currentThread]);
}];
/*
NSOperation:
主队列: [NSOperationQueue mainQueue] 和GCD中的主队列一样,串行队列
非主队列: [[NSOperationQueue alloc]init] 非常特殊(同时具备并发和串行的功能)
//默认情况下,非主队列是并发队列
*/
NSOperationQueue *queue = [NSOperationQueue mainQueue];
//追加任务
[blockOp1 addExecutionBlock:^{
NSLog(@"4----%@",[NSThread currentThread]);
}];
[queue addOperation:blockOp1];
/**
* 设置最大并发数量 maxConcurrentOperationCount
同一时间最多有多少个任务可以执行
串行执行任务!=只开一条线程 (线程同步)
maxConcurrentOperationCount >1 那么就是并发队列
maxConcurrentOperationCount == 1 那就是串行队列
maxConcurrentOperationCount == 0 不会执行任务
maxConcurrentOperationCount == -1 特殊意义 最大值 表示不受限制
*/
self.queue.maxConcurrentOperationCount = 1;
- (IBAction)strartButtonClick:(id)sender
{
self.queue = [[NSOperationQueue alloc]init];
self.queue.maxConcurrentOperationCount = 1;
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
for (NSInteger i = 0; i <1000; i++) {
NSLog(@"op1----%zd-----%@",i,[NSThread currentThread]);
}
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
for (NSInteger i = 0; i <1000; i++) {
NSLog(@"op2----%zd-----%@",i,[NSThread currentThread]);
}
}];
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
for (NSInteger i = 0; i <1000; i++) {
NSLog(@"op3----%zd-----%@",i,[NSThread currentThread]);
}
}];
[self.queue addOperation:op1];
[self.queue addOperation:op2];
[self.queue addOperation:op3];
}
/**
* 暂停
不能暂停当前正在处于执行状态的任务,比如现在有个循环100次,如果执行了暂停,只能在循环100次结束后暂停
*/
- (IBAction)supendedButtonClick:(id)sender
{
[self.queue setSuspended:YES];
}
/**
* 继续
*/
- (IBAction)continueButtonClick:(id)sender
{
[self.queue setSuspended:NO];
}
/**
* 取消,不可以恢复
该方法内部调用了所有操作的cancel方法
*/
- (IBAction)cancleButtonClick:(id)sender
{
//取消所有线程任务
[self.queue cancelAllOperations];
}
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
NSOperationQueue *queue2 =[[NSOperationQueue alloc]init];
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"1---%@",[NSThread currentThread]);
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"2---%@",[NSThread currentThread]);
}];
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"3---%@",[NSThread currentThread]);
}];
NSBlockOperation *op4 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"4---%@",[NSThread currentThread]);
}];
//线程1 依赖于 线程4 依赖可以跨线程
[op1 addDependency:op4];
//线程4 依赖于 线程2
[op4 addDependency:op2];
//线程2 依赖于 线程3
[op2 addDependency:op3];
//执行结果 3->2->4->1
/**
* 不可以循环依赖
[op1 addDependency:op4];
[op4 addDependency:op1];
这样谁都不会执行
*/
//操作监听 在执行这个block块的时候有可能调用同一条线程,也有可能不是
op3.completionBlock = ^{
NSLog(@"++++++%@",[NSThread currentThread]);
};
[queue addOperation:op1];
[queue addOperation:op2];
[queue addOperation:op3];
[queue2 addOperation:op4];
NSOperationQueue *queue = [[NSOperationQueue alloc]init];
NSBlockOperation *download1 = [NSBlockOperation blockOperationWithBlock:^{
NSURL *url = [NSURL URLWithString:@"http://4493bz.1985t.com/uploads/allimg/150127/4-15012G52133.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];
self.image1 = [UIImage imageWithData:data];
NSLog(@"download1----%@",[NSThread currentThread]);
}];
NSBlockOperation *download2 = [NSBlockOperation blockOperationWithBlock:^{
NSURL *url = [NSURL URLWithString:@"http://4493bz.1985t.com/uploads/allimg/150127/4-15012G52133.jpg"];
NSData *data = [NSData dataWithContentsOfURL:url];
self.image2 = [UIImage imageWithData:data];
NSLog(@"download2----%@",[NSThread currentThread]);
}];
NSBlockOperation *configQueue =[NSBlockOperation blockOperationWithBlock:^{
self.imageView1.alpha = 0.8;
self.imageView1.alpha = 0.5;
//在主线程中更新UI
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
self.imageView1.image = self.image1;
self.imageView2.image = self.image2;
NSLog(@"UI----%@",[NSThread currentThread]);
}];
}];
//添加依赖
[configQueue addDependency:download1];
[configQueue addDependency:download2];
[queue addOperation:download1];
[queue addOperation:download2];
[queue addOperation:configQueue];
-
自定义NSOperation类
-
NSOperation 的 addOperation方法默认会先调用strat方法,在strat内部会调用main方法,所以当我们自定义一个NSOperation类的时候,重写strat方法或者main都可以。NSThread是通过main方法封装
网友评论