NSOperation
NSOperation的使用
建立NSOperationQueue
NSOperation *queue = [[NSOperationQueue alloc] init];
複製程式碼
建立NSOperation子類物件
NSOperation *operation = [[NSOperation alloc] init];
需要重寫NSOperation任務執行函式。
MyOperation *operation = [[MyOperation alloc] init];
複製程式碼
operation.completionBlock = ^() {};
// 需注意,
//completionBolck的執行不在主執行緒,也不在operation的佇列中。
//是系統分配的一個後臺執行緒
複製程式碼
將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,優先順序,暫停