NSOperation:3-任务间的执行依赖
在GCD中可以使用队列组来设置任务之间的依赖关系,而在NSOperation中则提供了更加方便直观的方式来设置任务执行的先后顺序关系。通过NSOperation类中的addDependency方法,即可添加任务之间的依赖关系。由于addDependency是NSOperation类中的方法,与队列无关,因此也可以针对不同队列中的任务设置任务执行的先后依赖关系。
下方的示例中,有3个任务依次顺序执行,先依次下载两张图片,图片下载完成后,需要返回主线程去更新界面上的UIImageView,等图片下载并刷新界面完成后,第三个任务是更新界面上的下载状态Label。这3个任务的执行有先后依赖关系。
- (IBAction)downloadTwoImage:(id)sender {
//创建两个任务,两个任务完成后,返回主线程执行第三个更新Label的任务
NSBlockOperation *task1 = [NSBlockOperation blockOperationWithBlock:^{
//下载网络图片
NSString *urlStr = @"http://qiniu.99ios.com/99logo.png";
NSURL *url = [NSURL URLWithString:urlStr];
NSData *imageData = [NSData dataWithContentsOfURL:url];
UIImage *image1 = [UIImage imageWithData:imageData];
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
[mainQueue addOperationWithBlock:^{
self.imageView1.image = image1;
}];
}];
NSBlockOperation *task2 = [NSBlockOperation blockOperationWithBlock:^{
//下载网络图片
NSString *urlStr = @"http://qiniu.99ios.com/99logo.png";
NSURL *url = [NSURL URLWithString:urlStr];
NSData *imageData = [NSData dataWithContentsOfURL:url];
UIImage *image2 = [UIImage imageWithData:imageData];
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
[mainQueue addOperationWithBlock:^{
self.imageView2.image = image2;
}];
}];
NSBlockOperation *task3 = [NSBlockOperation blockOperationWithBlock:^{
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
[mainQueue addOperationWithBlock:^{
self.label.text = @"下载完成";
}];
}];
//设置任务之间的执行依赖关系
[task3 addDependency:task1];
[task3 addDependency:task2];
[task2 addDependency:task1];
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
[queue addOperation:task1];
[queue addOperation:task2];
[queue addOperation:task3];
}
示例代码
https://github.com/99ios/11.3.3
文章发布时间为: September 30th , 2016 at 06:00 pm
最后编辑时间为: September 13th , 2017 at 03:11 pm
本文由 99ios 创作,转载请注明出处
最后编辑时间为: September 13th , 2017 at 03:11 pm
本文由 99ios 创作,转载请注明出处