iOS多线程开发中,NSOperation是我们经常使用的,有时系统自带的两个类NSInvocationOperation和NSBlockOperation不能满足我们的需求时就需要我们自定义。
自定义NSOperation分两种,一种是自定义非并发的NSOperation,一种是定义并发的NSOperation的。下面分别介绍。
一:定义非并发的NSOperation。
定义非并发的NSOperation的比较简单:
1.实现main方法,在main方法中执行自定义的任务
2.正确的响应取消事件
具体代码如下:
在ZCNoCurrentOperation.h文件中:
// ZCNoCurrentOperation.h
// 自定义非并发NSOPeration
// Created by MrZhao on 16/9/13.
// Copyright © 2016年 MrZhao. All rights reserved.
/*
*自定义非并发的NSOperation步骤:1.实现main方法,在main方法中执行自定义的任务
2.正确的响应取消事件
*/
#import <Foundation/Foundation.h>
@interface ZCNoCurrentOperation : NSOperation
@end
在ZCNoCurrentOperation.m中要注意两点1.创建释放池,2.正确相应取消事件。
// ZCNoCurrentOperation.m
// 自定义非并发NSOPeration
//
// Created by MrZhao on 16/9/13.
// Copyright © 2016年 MrZhao. All rights reserved.
#import "ZCNoCurrentOperation.h"
@implementation ZCNoCurrentOperation
/*自定义main方法执行你的任务*/
- (void)main {
//捕获异常
@try {
//在这里我们要创建自己的释放池,因为这里我们拿不到主线程的释放池
@autoreleasepool {
BOOL isDone = NO;
//正确的响应取消事件
while(![self isCancelled] && !isDone)
{
//在这里执行自己的任务操作
NSLog(@"执行自定义非并发NSOperation");
NSThread *thread = [NSThread currentThread];
NSLog(@"%@",thread);
//任务执行完成后将isDone设为YES
isDone = YES;
}
}
}
@catch (NSException *exception) {
}
}
@end
我们在ViewDidLoad函数中使用我们自定义的operation,并调用start方法
(void)viewDidLoad {
[super viewDidLoad];
ZCNoCurrentOperation *operation1 = [[ZCNoCurrentOperation alloc] init];
//默认情况下,该operati
[operation1 start];
}
打印结果如下:
默认情况下,该operation在当前调用start的线程中执行.其实如果我们创建多个自定义的ZCNoCurrentOperation,并放入NSOperationQueue中,这些任务也是并发执行的,只不过因为我们没有处理并发情况下,线程执行完,KVO等操作,因此不建议在只实现main函数的情况下将其加入NSOperationQueue,只实现main一般只适合自定义非并发的。
#import "ViewController.h"
#import "ZCNoCurrentOperation.h"
@interface ViewController ()
@property(nonatomic,strong)NSOperationQueue *myQueue;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.myQueue = [[NSOperationQueue alloc] init];
ZCNoCurrentOperation *operation1 = [[ZCNoCurrentOperation alloc] init];
[self.myQueue addOperation:operation1];
ZCNoCurrentOperation *operation2 = [[ZCNoCurrentOperation alloc] init];
[self.myQueue addOperation:operation2];
ZCNoCurrentOperation *operation3 = [[ZCNoCurrentOperation alloc] init];
[self.myQueue addOperation:operation3];
}
@end
二:自定义并发的NSOperation
自定义并发的NSOperation需要以下步骤:
1.start方法:该方法必须实现,
2.main:该方法可选,如果你在start方法中定义了你的任务,则这个方法就可以不实现,但通常为了代码逻辑清晰,通常会在该方法中定 义自己的任务
3.isExecuting isFinished 主要作用是在线程状态改变时,产生适当的KVO通知
4.isConcurrent :必须覆盖并返回YES;
下面给出代码:
在ZCCurrentOperation.h中
// ZCCurrentOperation.h
// 自定义非并发NSOPeration
// Created by MrZhao on 16/9/13.
// Copyright © 2016年 MrZhao. All rights reserved.
/*
*自定义并发的NSOperation需要以下步骤:
1.start方法:该方法必须实现,
2.main:该方法可选,如果你在start方法中定义了你的任务,则这个方法就可以不实现,但通常为了代码逻辑清晰,通常会在该方法中定义自己的任务
3.isExecuting isFinished 主要作用是在线程状态改变时,产生适当的KVO通知
4.isConcurrent :必须覆盖并返回YES;
*/
#import <Foundation/Foundation.h>
@interface ZCCurrentOperation : NSOperation {
BOOL executing;
BOOL finished;
}
@end
在ZCCurrentOperation.m中
// ZCCurrentOperation.m
// 自定义非并发NSOPeration
// Created by MrZhao on 16/9/13.
// Copyright © 2016年 MrZhao. All rights reserved.
#import "ZCCurrentOperation.h"
@implementation ZCCurrentOperation
- (id)init {
if(self = [super init])
{
executing = NO;
finished = NO;
}
return self;
}
- (BOOL)isConcurrent {
return YES;
}
- (BOOL)isExecuting {
return executing;
}
- (BOOL)isFinished {
return finished;
}
- (void)start {
//第一步就要检测是否被取消了,如果取消了,要实现相应的KVO
if ([self isCancelled]) {
[self willChangeValueForKey:@"isFinished"];
finished = YES;
[self didChangeValueForKey:@"isFinished"];
return;
}
//如果没被取消,开始执行任务
[self willChangeValueForKey:@"isExecuting"];
[NSThread detachNewThreadSelector:@selector(main) toTarget:self withObject:nil];
executing = YES;
[self didChangeValueForKey:@"isExecuting"];
}
- (void)main {
@try {
@autoreleasepool {
//在这里定义自己的并发任务
NSLog(@"自定义并发操作NSOperation");
NSThread *thread = [NSThread currentThread];
NSLog(@"%@",thread);
//任务执行完成后要实现相应的KVO
[self willChangeValueForKey:@"isFinished"];
[self willChangeValueForKey:@"isExecuting"];
executing = NO;
finished = YES;
[self didChangeValueForKey:@"isExecuting"];
[self didChangeValueForKey:@"isFinished"];
}
}
}
}
@end
我们来测试一下:
// ViewController.m
// 自定义并发NSOperation
//
// Created by MrZhao on 16/9/13.
// Copyright © 2016年 MrZhao. All rights reserved.
#import "ViewController.h"
#import "ZCCurrentOperation.h"
@interface ViewController ()
@property (nonatomic,strong)NSOperationQueue *myQueue;
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
self.myQueue = [[NSOperationQueue alloc] init];
ZCCurrentOperation *operation1 = [[ZCCurrentOperation alloc] init];
ZCCurrentOperation *operation2 = [[ZCCurrentOperation alloc] init];
[self.myQueue addOperation:operation2];
ZCCurrentOperation *operation3 = [[ZCCurrentOperation alloc] init];
[self.myQueue addOperation:operation3];
}
@end
以上就是实现自定义NSOperation的相关内容,下面章节会给出一个具体的应用实例。