码迷,mamicode.com
首页 > 其他好文 > 详细

进阶篇第三期:继承NSOperation

时间:2015-03-29 18:12:36      阅读:114      评论:0      收藏:0      [点我收藏+]

标签: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

进阶篇第三期:继承NSOperation

标签:ios

原文地址:http://neusoftios.blog.51cto.com/9977509/1626175

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!