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

NSOperation:2-线程间通信

与GCD相同,对于放在后台线程执行的任务执行完成后,通常是通过网络获取数据后返回主线程进行界面UI的更新。在NSOperationQueue类中,也可以获取主线程队列,相关更新UI的任务必须放在主队列中完成。

我们还是使用与GCD中相同的案例来讲解NSOperation的线程间通信知识。如下图所示,当点击开始下载按钮后,会创建一个NSBlockOperation对象,放在一个普通队列中执行,开始下载网络图片。此时,由于下载任务是在非主线程中进行的,所以此时是可以响应用户交互的(例如,在界面上添加一个switch按钮,此时按钮是可以点击的)。等下载完成后,需要在下载任务中返回主线程去设置UI界面。

下方的示例代码,对之前使用GCD实现线程通信的方式替换为使用NSOperation。

- (IBAction)downloadImage:(id)sender {
    //创建任务
    NSBlockOperation *downloadTask = [NSBlockOperation blockOperationWithBlock:^{
        //下载网络图片
        NSString *urlStr = @"http://qiniu.99ios.com/99logo.png";
        NSURL *url = [NSURL URLWithString:urlStr];
        NSData *imageData = [NSData dataWithContentsOfURL:url];
        UIImage *image = [UIImage imageWithData:imageData];       
        //返回主线程设置UI
        NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];
        [mainQueue addOperationWithBlock:^{
            self.imageView.image = image;
        }];
    }];    
    //创建队列
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];   
    [queue addOperation:downloadTask]; 
}

示例代码

https://github.com/99ios/11.3.2