相對于GCD。NSOperation更加靈活,能夠自如地操作生命周期。
NSOperation是一個抽象的類,在使用時,使用的是他的兩個子類NSInvocationOperation和
基本實現(xiàn)
NSInvocationOperation:target形式
- (void)baseUseDemo {
NSInvocationOperation *op = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(doSomething) object:nil];
[NSOperationQueue.mainQueue addOperation:op];
}
- (void)doSomething {
NSLog(@"hello Operation");
}
NSBlockOperation:block形式
- (void)baseUseDemo {
NSBlockOperation *blockOp = [[NSBlockOperation alloc] init];
//添加執(zhí)行代碼塊
[blockOp addExecutionBlock:^{
NSLog(@"This is BlockOperation!");
}];
//設(shè)置監(jiān)聽
blockOp.completionBlock = ^{
NSLog(@"Completion");
};
//添加到隊列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:blockOp];
}
優(yōu)先級
blockOp.qualityOfService = NSQualityOfServiceUserInteractive;
typedef NS_ENUM(NSInteger, NSQualityOfService) {
NSQualityOfServiceUserInteractive = 0x21,
NSQualityOfServiceUserInitiated = 0x19,
NSQualityOfServiceUtility = 0x11,
NSQualityOfServiceBackground = 0x09,
NSQualityOfServiceDefault = -1
} API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0));
UserInteractive優(yōu)先級最高,NSQualityOfServiceBackground優(yōu)先級最低。
設(shè)置并發(fā)數(shù)
queue.maxConcurrentOperationCount = 2;
設(shè)置依賴關(guān)系
- (void)dependencyDemo {
NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{
[NSThread sleepForTimeInterval:0.5];
NSLog(@"任務(wù)1");
}];
NSBlockOperation *op2 = [NSBlockOperation blockOperationWithBlock:^{
[NSThread sleepForTimeInterval:0.5];
NSLog(@"任務(wù)2");
}];
NSBlockOperation *op3 = [NSBlockOperation blockOperationWithBlock:^{
[NSThread sleepForTimeInterval:0.5];
NSLog(@"任務(wù)3");
}];
[op2 addDependency:op1];
[op3 addDependency:op2];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperations:@[op1, op2, op3] waitUntilFinished:YES];
}
掛起
[queue setSuspended:YES];
注意:suspended不能掛起已經(jīng)被執(zhí)行的任務(wù)。
[queue cancelAllOperations];
干掉所有任務(wù)。下次得重新添加任務(wù)