登录 立即注册
金钱:

Code4App-iOS开发-iOS 开源代码库-iOS代码实例搜索-iOS特效示例-iOS代码例子下载-Code4App.com

查看: 162|回复: 6

iOS-UIImageView加载网络下载的图片(异步+多线程)

[复制链接]

280

主题

485

帖子

2278

金钱

手工艺人

发表于 2018-1-8 10:47:54 | 显示全部楼层 |阅读模式

        

        最原始的加载网络下载的图片方式:

[Java] 查看源文件 复制代码
//最原始加载网络图片方法,相当阻塞主线程,界面卡顿
-(void)setImageWithURL:(NSString *)imageDownloadUrl{
    UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(44, 64, 250, 250)];
    NSURL *URL = [NSURL URLWithString:imageDownloadUrl];
    NSError *ERROR;
    NSData *imageData = [NSData dataWithContentsOfURL:URL options:NSDataReadingMappedIfSafe error:&ERROR];
    UIImage *image = [UIImage imageWithData:imageData];
    [imageView setImage:image];
}

        使用异步线程加载图片,在加载完成后设置图片,可以在网络加载完成之前,UIimageview先使用占位图片。

[Java] 查看源文件 复制代码
//异步线程加载网络下载图片 ——> 回到主线程更新UI
-(void)downloadImageWithUrl:(NSString *)imageDownloadURLStr{
    //以便在block中使用
    __block UIImage *image = [[UIImage alloc] init];
    //图片下载链接
    NSURL *imageDownloadURL = [NSURL URLWithString:imageDownloadURLStr];

    //将图片下载在异步线程进行
    //创建异步线程执行队列
    dispatch_queue_t asynchronousQueue = dispatch_queue_create("imageDownloadQueue", NULL);
    //创建异步线程
    dispatch_async(asynchronousQueue, ^{
        //网络下载图片  NSData格式
        NSError *error;
        NSData *imageData = [NSData dataWithContentsOfURL:imageDownloadURL options:NSDataReadingMappedIfSafe error:&error];
        if (imageData) {
            image = [UIImage imageWithData:imageData];
        }
        //回到主线程更新UI
        dispatch_async(dispatch_get_main_queue(), ^{
            [_imageView setImage:image];
        });
    });
}

        如果考虑到线程安全,需要开启自动释放池,此方法同上:

[Java] 查看源文件 复制代码
#pragma mark - 下载图片-子线程调用
-(void)downloadImage{

    /**
     子线程里面的runloop默认不开启,也就意味着不会自动创建自动释放池,子线程里面autorelease的对象 就会没有池子释放。也就一位置偶棉没有办法进行释放造成内存泄露
     所以需要手动创建

     */

    @autoreleasepool {

        NSLog(@"%@",[NSThread currentThread]);

        NSURL *url = [NSURL URLWithString:@"https://baidu.com/image/Users/qiuxuewei/Desktop/qiu.JPG"];

        NSData *data = [NSData dataWithContentsOfURL:url];

        UIImage *image0 = [UIImage imageWithData:data];

        UIImage *image = [UIImage imageNamed:@"qiu.JPG"];

        //UI要求在主线程中进行
        //self.imageView.image = image;

       //1、 [self performSelectorOnMainThread:@selector(updataImage:) withObject:image waitUntilDone:NO];
       //2、 [self performSelector:@selector(updataImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES];
        [self.imageView performSelectorOnMainThread:@selector(updataImage:) withObject:image waitUntilDone:YES];

        //waitUntilDone:  表示是否等待子线程方法执行完毕
        //如果是YES:那就等子线程方法执行完再执行当前函数
        NSLog(@"完成..");
    }
}

-(void)updataImage:(UIImage *)image{

    self.imageView.image = image;

}

                                               

16

主题

7072

帖子

989

金钱

手工艺人

发表于 2018-1-8 16:41:22 | 显示全部楼层
感谢大神分享,必须顶!

23

主题

7058

帖子

1054

金钱

iOS大神

Rank: 6Rank: 6

分享大神

发表于 2018-1-8 17:17:42 | 显示全部楼层
感谢大神~

20

主题

7050

帖子

2258

金钱

手工艺人

发表于 2018-1-8 18:09:39 | 显示全部楼层
感谢大神~

0

主题

7028

帖子

-519

金钱

限制会员

发表于 2018-1-8 19:35:20 | 显示全部楼层
mark,收藏了

20

主题

7076

帖子

2215

金钱

手工艺人

发表于 2018-1-8 21:24:19 | 显示全部楼层
code4app确实是个好地方,必须支持~

14

主题

7034

帖子

1375

金钱

手工艺人

发表于 2018-1-9 01:03:08 | 显示全部楼层
小弟学习了~支持,支持
*滑动验证:
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

关闭

每日头条

通过邮件订阅最新 Code4App 信息
上一条 /4 下一条

广告投放| Github|申请友链|手机版|Code4App ( 粤ICP备15117877号-1 )

快速回复 返回顶部 返回列表