您的位置:首页 > 运维架构

NSOperation自定义

2015-11-30 17:02 344 查看
示例代码如下:

//
//  MyOperation.m
//  Test9
//
//  Created by lagou on 15/11/30.
//  Copyright © 2015年 lagou. All rights reserved.
//

#import "MyOperation.h"

@interface MyOperation()

@property (assign, nonatomic, getter = isExecuting) BOOL executing;
@property (assign, nonatomic, getter = isFinished) BOOL finished;

@property(nonatomic, strong) NSURLRequest *request;
@property(nonatomic, strong) NSURLSession *session;

@property(nonatomic, strong) NSString *threadName;

@end

@implementation MyOperation

@synthesize executing = _executing;
@synthesize finished = _finished;

- (id)initWithName:(NSString *)name{
if (self = [super init]) {
_threadName = name;
_executing = NO;
_finished = NO;
}
return self;
}

- (void)start {
if (self.isCancelled) {
self.finished = YES;
return;
}
self.executing = YES;//不知道有没有必要写

//开启任务
.......
//结束任务

[self done];
return;
}

//执行完了一定要调用done,否则不认为执行结束了
- (void)done {
self.finished = YES;
self.executing = NO;
[self reset];
}

- (void)reset {

}

- (void)setFinished:(BOOL)finished {
[self willChangeValueForKey:@"isFinished"];
_finished = finished;
[self didChangeValueForKey:@"isFinished"];
}

- (void)setExecuting:(BOOL)executing {
[self willChangeValueForKey:@"isExecuting"];
_executing = executing;
[self didChangeValueForKey:@"isExecuting"];
}
//这两个函数 根本就没调用到 而且写不写都是并发的 奇怪
- (BOOL)isConcurrent {
return YES;
}
//iOS8之后
- (BOOL)isAsynchronous {
return YES;
}
@end


NSOperation提供了
ready
cancelled
executing
finished
这几个状态变化,我们的开发也是必须处理自己关心的其中的状态。这些状态都是基于keypath的KVO通知决定,所以在你手动改变自己关心的状态时,请别忘了手动发送通知。这里面每个属性都是相互独立的,同时只可能有一个状态是YES。
finished
这个状态在操作完成后请及时设置为YES,因为NSOperationQueue所管理的队列中,只有isFinished为YES时才将其移除队列,这点在内存管理和避免死锁很关键
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: