当前位置: 首页 > news >正文

万虹点读机如何做系统下载网站/b站推广入口

万虹点读机如何做系统下载网站,b站推广入口,广东网页制作二级考试题目,wordpress摘要 字数NSOperationQueue时iOS中常用的任务调度机制。在创建一个复杂任务的时候,我们通常都需要编写NSOperation的子类。在大部分情况下,重写main方法就可以满足要求。main方法执行完毕后,系统就会认为这个operation完成了。 有时候情况并没有这么简…

NSOperationQueue时iOS中常用的任务调度机制。在创建一个复杂任务的时候,我们通常都需要编写NSOperation的子类。在大部分情况下,重写main方法就可以满足要求。main方法执行完毕后,系统就会认为这个operation完成了。

 

有时候情况并没有这么简单。我们需要在operation中调用异步的API,这个API会通过一个block或者代理通知我们结果。这时只靠覆盖main方法就显得力不从心了。因为异步API尚未执行完毕,main方法并不会等待任务执行完毕,而是立即返回,系统就认为operation已经完成了。

 

怎么解决这个问题呢?我想到AFNetworking中有同样的案例,于是参考了其中的实现,设计了一个基于异步任务的operation。

 

我们需要覆盖start方法。这个方法的作用有点类似于main方法,在这里完成具体的任务。那么系统怎么知道我们的任务开始执行,或者完成了呢?系统会通过KVO的形式,监听operation的一些属性。我们可以重新实现这些属性,这样系统就可以监听operation执行的状态。

我们需要重新实现这些属性:

@property (readonly, getter=isReady) BOOL ready;
@property (readonly, getter=isExecuting) BOOL executing;
@property (readonly, getter=isFinished) BOOL finished;

 

它们都是只读属性。我们可以简单的重写它们,返回我们想要的值。但是,如何通知KVO系统它们的值发生了变化呢?

NSObject的这一对方法能够帮助我们,可以利用它们手动通知系统某个属性发生了变化。

- (void)willChangeValueForKey:(NSString *)key;
- (void)didChangeValueForKey:(NSString *)key;

 

下面就是完整的代码。这里只用了一个NSTimer模拟一个异步的任务。在state变化时,我们需要通知KVO系统operation的状态发生了变化。这一步很重要,我刚开始忽略了手动通知KVO,导致任务永远无法完成(即使start中的任务全部执行完毕)。

typedef NS_ENUM(NSInteger, MyOperationState) {MyOperationStateReady,MyOperationStateExecuting,MyOperationStateFinished
};@interface MyOperation : NSOperation@property (nonatomic, strong) NSTimer *exeTimer;
@property (nonatomic, assign) MyOperationState state; // 用来记录operation的状态
@property (nonatomic, strong) NSLock *lock; // 加锁保证线程安全@end@implementation MyOperation- (instancetype)init
{self = [super init];if (self) {self.lock = [NSLock new];[self willChangeValueForKey:@"isReady"];self.state = MyOperationStateReady;[self willChangeValueForKey:@"isReady"];}return self;
}- (void)start
{[self.lock lock];if (!self.finished && self.state == MyOperationStateReady) {
// 触发
isExecuting属性的KVO观察者,这样系统就知道这个operation已经开始执行了
[self willChangeValueForKey:@"isExecuting"]; self.state = MyOperationStateExecuting; [self didChangeValueForKey:@"isExecuting"];
        // 这里用一个timer模拟一个耗时的任务self.exeTimer = [NSTimer timerWithTimeInterval:5 target:self selector:@selector(finish) userInfo:nil repeats:NO];[[NSRunLoop mainRunLoop] addTimer:self.exeTimer forMode:NSRunLoopCommonModes];}[self.lock unlock];
}- (void)cancel
{[self.lock lock];if (!self.isFinished && !self.cancelled) {[super cancel];[self.exeTimer invalidate];}[self.lock unlock];
}- (BOOL)isReady
{return self.state == MyOperationStateReady;
}- (BOOL)isExecuting
{return self.state == MyOperationStateExecuting;
}- (BOOL)isFinished
{return self.state == MyOperationStateFinished;
}- (BOOL)isAsynchronous
{return YES;
}- (BOOL)isConcurrent
{return YES;
}- (void)finish
{[self.lock lock];

// 触发isFinished属性的KVO观察者,这样系统就知道这个operation已经执行完毕
    [self willChangeValueForKey:@"isFinished"]; 
self.state = MyOperationStateFinished;
[self didChangeValueForKey:@"isFinished"];
[self.lock unlock];
}
@end

 

转载于:https://www.cnblogs.com/jiuzhou/p/5299535.html

http://www.jmfq.cn/news/5256415.html

相关文章:

  • 企点是干嘛用的/广东seo加盟
  • 百度霸屏推广/seo搜索引擎排名优化
  • 门户网站建设策划/seo是什么职业
  • 网站建设与管理读后感/建一个app平台的费用多少
  • 个人办公室装修效果图/站长工具seo综合查询 分析
  • 营销型网站建设费用怎么这么大/分发平台
  • 企业网站怎么做才能留住客户/重庆seo整站优化设置
  • 建立网站时什么可以使用中文/百度入驻
  • 东莞海外网络推广/南京网站seo
  • 阿里巴巴国际站网页设计教程/国内免费建网站
  • 怎么做企业招聘网站/国家认可的教育培训机构
  • 网站建设宣传预算/手机怎么制作网页
  • 郑州做网站网站建设费用/广州今日新闻最新消息
  • 中药网站模板/搜索指数的数据来源
  • 武汉做网站便宜公司哪家好/百度统计app下载
  • 网站运营者网址/百度电话人工服务
  • 毕业设计难度适中的网站开发项目题目/百度app免费下载安装
  • 做网站应该买哪一种服务器/友情链接收录
  • 中国做类似 esty的网站/怎么联系百度客服人工服务
  • 怎么把自己做的网站发布/宁波网站关键词优化代码
  • 住房城乡建设局网站/seo关键词排名查询
  • 微信网站模板源码/深圳华强北
  • 做网站时的电话图标/百度快速seo
  • 有人做彩票网站吗/sem优化托管
  • 电子商务网站开发的题/义乌百度广告公司
  • 广告网站建设价格/免费创建网站平台
  • 如何做的网站排第一/网站发布与推广
  • 网上做家教哪个网站/西安seo霸屏
  • web网站发布/seo长尾关键词排名
  • 怎么做棋牌网站/如何在百度推广网站