NSOperation:面向?qū)ο蟮木€程技術(shù)
不需要關(guān)心線程管理、數(shù)據(jù)同步的事情奏司,可以把精力放在自己需要執(zhí)行的操作上
面向?qū)ο?/p>
NSOperation中兩個常用對象:
1.NSInvocationOperation
示例:
//定義操作隊列
@property (nonatomic, strong) NSOperationQueue *queue;
- (void)operationLoad{
for (UIImageView *imageView in self.imageViewSet) {
// invocation
NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(threadLoadImage:) object:imageView];
// 直接調(diào)用operation的start方法件舵,是在主線程隊列上運行的,不會開啟新的線程
// [operation start];
// 將invacation添加到隊列吟榴,已添加到隊列茫蛹,就會開啟新的線程執(zhí)行任務(wù)
[self.queue addOperation:operation];
}
}
2.NSBlockOperation
定義完operation之后將操作添加到NSOperationQueue即可啟動任務(wù)
示例:
- (void)operationLoad{
for (UIImageView *imageView in self.imageViewSet) {
// block
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
[self operationLoadImage:imageView];
}];
[self.queue addOperation:operation];
}
}
優(yōu)點:
1.使用setMaxConcurrentOperationCount可以控制同時并發(fā)的線程數(shù)量
// 隊列可以設(shè)置同時并發(fā)線程數(shù)量
[self.queue setMaxConcurrentOperationCount:4];
2.使用addDependency可以添加依賴操刀,從而控制線程執(zhí)行順序
- (void)operationDemo{
NSBlockOperation *operation1 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"操作1:%@",[NSThread currentThread]);
}];
NSBlockOperation *operation2 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"操作2:%@",[NSThread currentThread]);
}];
NSBlockOperation *operation3 = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@"操作3:%@",[NSThread currentThread]);
}];
/**
* Dependency依賴
* 可以多重依賴
* 注意不要建立循環(huán)依賴
*/
// operation2依賴于operation1
[operation2 addDependency:operation1];
[operation3 addDependency:operation2];
[self.queue addOperation:operation1];
[self.queue addOperation:operation2];
[self.queue addOperation:operation3];
}
提示
:要更新UI,需要使用[[NSOperationQueue mainQueue] addOperationWithBlock:^{}];在主隊列更新UI
- (void)operationLoadImage:(UIImageView *)imageView{
@autoreleasepool {
NSLog(@"%@",[NSThread currentThread]);
// 睡眠
// [NSThread sleepForTimeInterval:1.0f];
NSInteger num = arc4random_uniform(17) + 1;
NSString *imageName = [NSString stringWithFormat:@"NatGeo%02ld",(long)num];
// 在主線程隊列上更新UI
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
imageView.image = [UIImage imageNamed:imageName];
}];
}
}
持續(xù)完善……