博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NSOperation 异步 或 同步 实例
阅读量:6205 次
发布时间:2019-06-21

本文共 2484 字,大约阅读时间需要 8 分钟。

  hot3.png

http://www.cocoachina.com/bbs/read.php?tid-1709563.html

http://www.jianshu.com/p/3309b0c0cab3

同步或异步

默认的NSOperation是同步执行的,当start以后isExecuting会变成YES,然后立即执行main,当main返回后,isExecuting会设为NO并且isFinished会设为YES。
当你需要一个异步的Operation,那么重载start方法否则main就可以了。异步的Operation需要重载isExecuting和isFinished的getter,需要手动控制Operation的状态,不然当main返回后Operation会直接将isFinished设为YES。。。Operation就挂掉了。
其实异步的Operation是否重载main也没有关系,重载也没有什么意义就是了,因为状态都是手动控制的。
至于isConcurrent,现在则推荐isAsynchronous,我不太明确这两个的意义,因为我没见过系统会调用。可能只是一个flag,当你的自定义Operation是异步执行的就应该设置为YES,外部判断的时候可以知道,类似君子约定。。。
自定义的话看这里
 

 

1 NSOperation子类

@interface Operation ()@property (nonatomic, assign, getter=isExecuting) BOOL executing;@property (nonatomic, assign, getter=isFinished) BOOL finished;@end@implementation Operation@synthesize finished = _finished, executing = _executing;- (void)setFinished:(BOOL)finished {    [self willChangeValueForKey:@"isFinished"];    _finished = finished;    [self didChangeValueForKey:@"isFinished"];}- (void)setExecuting:(BOOL)executing {    [self willChangeValueForKey:@"isExecuting"];    _executing = executing;    [self didChangeValueForKey:@"isExecuting"];}- (void)start {    if (self.isCancelled) {        self.finished = YES;        return;    }        dispatch_async(dispatch_get_global_queue(0, 0), ^{        // 这里开始异步        // 如果用非同步的网络请求,这里没有必要手动添加到异步队列        // 当任务完成是需要修改finished和executing        self.finished = YES;        self.executing = NO;    });        self.executing = YES;}/**//是否同步- (BOOL)isAsynchronous{    return YES;} **/@end

2 调用

-(void)cell:(TableViewCell *)cell item:(FileInfo *)item indexPath:(NSIndexPath *)indexPath{//补全video信息        ViodeInfoTask *task = self.operationTaskCache[item.name];        if (!task) {            //初始化任务            task = [[ViodeInfoTask alloc] initWithFileInfo:item];            // 进行缓存            self.operationTaskCache[item.name] = task;            // 添加操作            [self.queue addOperation:task];            //任务结束后炒作            [task setCompletionBlock:^{                NSLog(@"任务结束:%@" , item.name);                // 回主线程展示                [[NSOperationQueue mainQueue] addOperationWithBlock:^{                    //刷新cell数据                    [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];                    // 下载完成,移除操作                    [self.operationTaskCache removeObjectForKey:item.name];                }];                            }];        }

 

转载于:https://my.oschina.net/huqiji/blog/870997

你可能感兴趣的文章
干货|Spring Cloud Bus 消息总线介绍
查看>>
IDEA去除mapper.xml文件中的sql语句的背景色
查看>>
一文详解java中对JVM的深度解析、调优工具、垃圾回收
查看>>
React 新 Context API 在前端状态管理的实践
查看>>
FFmpeg 是如何实现多态的?
查看>>
Java中的ReentrantLock和synchronized两种锁定机制的对比
查看>>
Node.js REPL(交互式解释器)
查看>>
java B2B2C springmvc mybatis电子商城系统(四)Ribbon
查看>>
CSS:元素塌陷问题
查看>>
Goalng软件包推荐
查看>>
Redis与Memcached的区别
查看>>
PHP程序员的技术成长规划
查看>>
OSChina 周四乱弹 ——妹子喜欢的是程序员 这是标准……
查看>>
OSChina 周四乱弹 —— 要成立复仇者联盟了,来报名
查看>>
vi的使用
查看>>
sphinx
查看>>
Jackson、JSON-lib、Gson性能对比
查看>>
Kali源库配置和拼音安装
查看>>
近期学习清单
查看>>
UI代码练习-视图的层次关系
查看>>