串聯NSOperation知識點

陳振發表於2017-12-13

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支援取消。封裝,能適應更復雜的操作和提供更精細化的控制。

螢幕快照 2017-07-18 下午11.45.55的副本.png

既是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;
複製程式碼

迴圈依賴 顯示迴圈依賴 隱式迴圈依賴

螢幕快照 2017-07-19 上午2.30.25的副本.png

優先順序

@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,優先順序,暫停