如何自定义NSOperation

在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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容