标签:ios
本期我们来介绍如何继承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]; }
调用这个方法以后呢,你也会惊奇的发现,果然不一样了哦,果然是并发的有木有
如果你真的有跟着这期的内容一起研究、探讨、动动手
你会发现:真的有好多好多有意思、有趣的事情哦,代码真的很好玩,里面的世界让人琢磨不透
那么我也只是写了部分主要的代码,这个过程还是要大家动手去完成的,它会巩固你的知识,也会让你在实践的时候发现更多的秘密,如果有技术上的秘密,记得来分享哦
欢迎小伙伴们来做补充,有相关问题都可以来技术交流群里面找我
本文出自 “东软iOS校友群的技术博客” 博客,请务必保留此出处http://neusoftios.blog.51cto.com/9977509/1626175
标签:ios
原文地址:http://neusoftios.blog.51cto.com/9977509/1626175