如何自定义NSOperation
2018-06-13 本文已影响36人
米修斯_
在iOS中使用线程主要是GCD,和NSOperation 两种方式。 GCD 对线程依赖,线程取消支持的不是很好,所以如果有这方面的需求果断使用NSOperation 。 NSOperation是个抽象方法,并不能直接使用,主要使用NSBlockOperation 和 NSInvocationOperation 两个子类来完成任务。当然也可以使用NSOperation的子类。自定义NSOperation 要实现start() isisReady(),isExecuting(),isFinished(),isConcurrent()方法,让系统知道线程的状态如果不重写这些方法系统会不知道线程的状态,不能完成响应的操作(如果不重写isFinish()方法,completeBlock 讲不会调用,因为系统并不知道线程状态已经结束。)。工作任务写在start方法中。新建好SubOperation之后 可以直接添加到NSOperationQueue中,线程自动执行。当然也可以调用start()方法.。
typedef enum {
AFOperationPausedState = -1,
AFOperationReadyState = 1,
AFOperationExecutingState = 2,
AFOperationFinishedState = 3,
} _AFOperationState;
typedef signed short AFOperationState;
@interface SubOperation : NSOperation
@property(nonatomic ,assign )AFOperationState state ;
@end
#import "SubOperation.h"
@implementation SubOperation
-(instancetype)init {
if (self =[super init]) {
self.state = AFOperationReadyState;
}
return self;
}
-(void)start {
int index = 0 ;
while (index < 5) {
self.state = AFOperationExecutingState ;
sleep(1);
index += 1;
}
self.state = AFOperationFinishedState;
}
- (BOOL)isReady {
return self.state == AFOperationReadyState && [super isReady];
}
- (BOOL)isExecuting {
return self.state == AFOperationExecutingState;
}
- (BOOL)isFinished {
return self.state == AFOperationFinishedState;
}
- (BOOL)isConcurrent {
return YES;
}
@end