-
简述
在前两章都只是介绍如何使用NSThread以及它的一些方法、状态,那么这一章我们来一个比较有意思的东西: 使用多线程之间的通信来做一个下载图片的Demo
-
撸码
首先 在
storyboard
中拖入一个UIImageView
控件并且属性名为:imageView
然后 写一个下载图片的方法 并给我们的
ImageView
赋值
/** * 下载图片 */ -(void)downloadImage{ //1.确定要下载网络图片的url地址,一个url唯一对应着网络上的一个资源 NSURL *url = [NSURL URLWithString:@"http://images.cnblogs.com/cnblogs_com/ljy-666/730636/o_20150902105459.png"]; //2.根据url地址下载图片数据到本地(二进制数据 NSData *data = [NSData dataWithContentsOfURL:url]; //3.把下载到本地的二进制数据转换成图片 UIImage *image = [UIImage imageWithData:data]; self.imageView.image = image; }
最后 在
touchesBegan
事件中调用;-
因为我的
xcode
是7.0,xcode
会报一个这样的错误:
说阻止了明文HTTP资源的下载,因为它不安全,可以通过配置info.plist文件来更改
那么这副图以及解决了这个问题
配置完
info.plist
之后 我们的图片是能够显示出来了,但是我们并没有使用到多线程,那么接下来我们就使用完成这种效果,也是本章的核心:线程之间的通信简单概括
1、点击屏幕的时候,我们创建一个线程用来做耗时的下载图片方法。
2、当图片下载完成,我们利用线程之间的通信
performSelectorOnMainThread
传递给主线程。3、最后给我们的
ImageView
赋上图片新增代码
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ // 开启一条子线程来下载图片 [NSThread detachNewThreadSelector:@selector(downloadImage) toTarget:self withObject:nil]; } /** * 下载图片 */ -(void)downloadImage{ //1.确定要下载网络图片的url地址,一个url唯一对应着网络上的一个资源 NSURL *url = [NSURL URLWithString:@"http://images.cnblogs.com/cnblogs_com/ljy-666/730636/o_20150902105459.png"]; //2.根据url地址下载图片数据到本地(二进制数据 NSData *data = [NSData dataWithContentsOfURL:url]; //3.把下载到本地的二进制数据转换成图片 UIImage *image = [UIImage imageWithData:data]; /* performSelectorOnMainThread 也是NSObject分类的一个方法 1.在主线程执行的方法 2.传递给方法的参数 3.是否等待被调用方法执行完成,有可能也会等待调用方法的执行完成!几率极少! */ [self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO]; NSLog(@"等于NO的话 我就不等setImage执行,等于YES的话 我就等setImage执行了我在执行"); }
以上代码就是我们本章的所有代码了
至于这段代码为什么要用
self.imageView
而不是self
,因为那个方法是在NSObject
类里面的,所有继承了NSObject
的类都是可以使用的,在加上setImage:
这个方法在imageView
里面是具有的所有我也没有去重写了[self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
-
结束
本章到此结束
欢迎各位码友随意转载并指正