示例代码如下:
//
// 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时才将其移除队列,这点在内存管理和避免死锁很关键。