在iOS开发中,一个进程中通常会有多个线程,而且这些线程往往不是孤立的,多个线程之间通常需要进行通信。线程通信具体表现为一个线程向另一个线程传递数据,或者某个线程在执行完特定的任务以后,需要转到另一个线程中继续执行任务。下面,我们就通过一个实例来简单演示一下线程间的通信。
一、简单实现一个图片下载实例
新建一个工程,程序运行以后,当我们点击屏幕,让它下载网络上指定的图片。在项目目录中选中Main.storyboard文件,往里面拖一个UIImageView控件,然后给它拖线。在ViewController中实现- touchesBegan: withEvent:方法:
// MARK:- 点击屏幕下载图片
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
// 点击下载图片
[self downloadImage];
}
// MARK:- 下载网络上指定的图片
- (void)downloadImage {
// 将URL地址转换为字符串
NSURL *url = [NSURL URLWithString:@"http://img1.gtimg.com/ent/pics/hv1/224/60/2171/141184799.jpg"];
// 根据URL地址将图片资源的二进制文件下载到本地
NSData *imageData = [NSData dataWithContentsOfURL:url];
// 将二进制数据转换为图片
UIImage *image = [UIImage imageWithData:imageData];
// 将图片设置到UIImageView控件上去
self.imageView.image = image;
// 打印当前线程
NSLog(@"%@", [NSThread currentThread]);
}
因为我们的图片来自网络,所以肯定需要图片的URL地址。有了地址以后,需要先将它转换为NSURL对象,然后再根据这个NSURL对象将图片的二进制数据下载到本地,接着再将图片的二进制数据转换为图片,最后再将它设置到UIImageView控件上去。
程序运行以后,当我们点击屏幕,并不会马上看到下载下来的图片。此时,控制台会打印一条消息: