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
文章发布时间为: September 30th , 2016 at 05:49 pm
最后编辑时间为: September 13th , 2017 at 03:10 pm
本文由 99ios 创作,转载请注明出处
最后编辑时间为: September 13th , 2017 at 03:10 pm
本文由 99ios 创作,转载请注明出处