免费开源的iOS开发学习平台

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