多线程篇-NSThread-线程之间的通信(下载图片)

简述
在前两章都只是介绍如何使用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会报一个这样的错误:

731729-20160113222036288-1625355666.png

`说阻止了明文HTTP资源的下载,因为它不安全,可以通过配置info.plist文件来更改`

那么这副图以及解决了这个问题

731729-20160113222104819-1317348406.png

 - 配置完`info.plist`之后  我们的图片是能够显示出来了,但是我们并没有使用到多线程,那么接下来我们就使用完成这种效果,也是本章的核心:线程之间的通信

- 简单概括
     * 1、点击屏幕的时候,我们创建一个线程用来做耗时的下载图片方法。
     * 2、当图片下载完成,我们利用线程之间的通信`performSelectorOnMainThread`传递给主线程。
     * 3、最后给我们的`ImageView`赋上图片
- 新增代码
    ```objc
    -(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`里面是具有的所有我也没有去重写了
```objc
[self.imageView performSelectorOnMainThread:@selector(setImage:) withObject:image waitUntilDone:NO];
```
结束
                  本章到此结束
            欢迎各位码友随意转载并指正

转载于:https://www.cnblogs.com/ljy-666/p/5125822.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值