本期我们来介绍如何继承NSOperation来实现Operation的并发与串行
在中级篇里面我已经为大家介绍了,关于NSOperation的两个系统类的使用,没错,很简单,下面我们就来推进以下继承NSOperation,自定义实现它的子类该如何实现呢
下面分为并发与串行,两种
并发:说白了,就是几个线程,共同开始,不一定共同结束
串行:说白了,就是几个线程,一个一个有顺序的执行
先来自定义一个串行的吧,我叫它NotConcurrenceOperation
自定义这个类以后,我们只要重写它的main方法就可以了
先为它添加一个初始化方法吧
- (id)initWithUrlString:(NSString *)urlString {
if (self = [super init]) {
self.urlString = urlString;
}
return self;
}
- (void)main {
// 新建一个自动释放池,如果是异步执行操作,那么将无法访问到主线程的自动释放池
@autoreleasepool {
if (self.isCancelled) {
return;
}
NSURL *urlString = [NSURL URLWithString:self.urlString];
NSData *dataString = [NSData dataWithContentsOfURL:urlString];
if (self.isCancelled) {
return;
}
NSLog(@"%@", dataString);
}
}
大家看到我在main方法里面手动创建了一个自动释放池,没错,虽然是ARC,但是我们还是会经常用到自动释放池来管理内存,就像代码里面写的注释一样,所以我们要手动加一个,听说RunLoop里面也有对应的方法,有时间,我也参考学习一下,在这里就不做过多的解释
另外我们在好多地方都有用到if语句来判断当前线程的状态,没错,这里也就是当我们取消操作的时候,我们要把它直接跳出Main方法
然后接下来我们看一看用代码如何创建一个并发的NSOperation
这时自定义一个并发的吧,我叫它ConcurrenceOperation
那我们在这里要重写几个方法,就不用重写main方法了哦
- (void)start {
//这里面我们来调用操作需要处理的事情
}
- (BOOL)isConcurrent {
return YES;
}
- (BOOL)isExecuting {
return YES;
}
- (BOOL)isFinished {
return YES;
}
其实还是蛮简单的,只不过需要我们手动的去重写一部分方法罢了
就这样,两个类创建好了,那么接下来我们来玩有意思的事情哦
for (int i = 0; i < 5; i++) {
NotConcurrenceOperation *notConcurrenceOperation = [[NotConcurrenceOperation alloc] initWithUrlString:@"http://www.baidu.com" withDelegate:self];
notConcurrenceOperation.name = [NSString stringWithFormat:@"%d", i];
notConcurrenceOperation.delegate = self;
[notConcurrenceOperation start];
}
调用这个方法以后,我们会再对应的协议返回来的数据中看到一个奇怪的事情
没错,就是它们5个操作的执行是串行的,也就是非并发的
再来看下面的代码段
for (int i = 0; i < 5; i++) {
ConcurrenceOperation *concurrenceOperation = [[ConcurrenceOperation alloc] initWithURLString:@"http://www.baidu.com"];
concurrenceOperation.name = [NSString stringWithFormat:@"%d", i];
concurrenceOperation.delegate = self;
[concurrenceOperation start];
}
调用这个方法以后呢,你也会惊奇的发现,果然不一样了哦,果然是并发的有木有
如果你真的有跟着这期的内容一起研究、探讨、动动手
你会发现:真的有好多好多有意思、有趣的事情哦,代码真的很好玩,里面的世界让人琢磨不透
那么我也只是写了部分主要的代码,这个过程还是要大家动手去完成的,它会巩固你的知识,也会让你在实践的时候发现更多的秘密,如果有技术上的秘密,记得来分享哦
欢迎小伙伴们来做补充,有相关问题都可以来技术交流群里面找我
转载于:https://blog.51cto.com/neusoftios/1626175