多线程 - 3
NSOperation
NSOperation的使用
创建NSOperationQueue
NSOperation *queue = [[NSOperationQueue alloc] init];
创建NSOperation子类对象
NSOperation *operation = [[NSOperation alloc] init];
需要重写NSOperation任务执行函数。
MyOperation *operation = [[MyOperation alloc] init];
将NSOperation加入NSOperationQueue
[queue addOperation:operation];
ios为了让我们更好的使用NSOperation,自定义了很多继承类
NSBlockOperation
+ (instancetype)blockOperationWithBlock:(void(^)(void))block;
NSInvocationOperation
- (nullable instancetype)initWithTarget:(id)target selector:(SEL)sel object:(nullable id)arg;
NSOperation并发数
系统默认提供:
@property NSInteger maxConcurrentOperationCount;
// = 1时,为Serial Queue
// > 1时,为Concurrent Queue
@property (readonly)NSUInteger operationCount;
//表示当前正在执行的queue中有多少任务。
GCD vs NSOperation
NSOperation支持取消。封装,能适应更复杂的操作和提供更精细化的控制。
既是queue被cancel了,最终仍会被执行。
等待
NSOperation不需要group的概念。
- (void)waitUntilFinished;
- (void)waitUntilAllOperationsAreFinished;
Dependency
@interface NSOperation : NSObject {
- (void)addDependency:(NSOperation *)op;
- (void)removeDependency:(NSOperation *)op;
}
@property (readonly, copy)NSArray<NSOperation *>*dependencies;
循环依赖
显示循环依赖
隐式循环依赖
优先级
@property NSOperationQueuePriority queuePriority;
Operation进入queue的原则是先进先出。但当优先级大的operation准备进入queue时,它会插队到比他小的operation前面。但不会替换掉正在执行的operation。
NSOperationQueue常用属性
@property (getter = isSuspended)BOOL suspended;
@property (nullable, copy)NSString *name;
@property NSQualityOfService qualityOfService;
总结:
NSOperation和NSOperationQueue的基本概念
自定义NSOperation子类
NSOperation状态和取消
NSOperation Dependency
waitUntilFinished
name,优先级,暂停