模仿SDWebImage实现异步加载图片

简介:

模仿SDWebImage实现异步加载图片

SDWebImage想必大家都不陌生吧,要实现它的图片异步加载功能这个还是很简单的.

注意:此处我只实现了异步加载图片,并没有将文件缓存到本地的打算哦:)

源码:

UIImageView+YXImageView.h

//
//  UIImageView+YXImageView.h
//  PicDemo
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface UIImageView (YXImageView)

- (void)setImageWithURL:(NSString *)url placeholderImage:(UIImage *)placeholder;

@end

UIImageView+YXImageView.m
//
//  UIImageView+YXImageView.m
//  PicDemo
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "UIImageView+YXImageView.h"

@implementation UIImageView (YXImageView)

- (void)setImageWithURL:(NSString *)url placeholderImage:(UIImage *)placeholder
{
    // 先设置placeholder
    self.image = placeholder;
    
    // 异步下载完了之后再加载新的图片
    if (url)
    {
        // 子线程下载
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            
            NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
            NSData *data          = [NSURLConnection sendSynchronousRequest:request
                                                          returningResponse:nil
                                                                      error:nil];
            // 主线程更新
            dispatch_async(dispatch_get_main_queue(), ^{
                if (data)
                {
                    self.image = [UIImage imageWithData:data];
                    [self setNeedsDisplay];
                }
            });
        });
    }
}

@end

使用的源码:

RootViewController.m

//
//  RootViewController.m
//  PicDemo
//
//  Copyright (c) 2014年 Y.X. All rights reserved.
//

#import "RootViewController.h"
#import "UIImageView+YXImageView.h"

@interface RootViewController ()

@end

@implementation RootViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
    [self.view addSubview:imageView];
    
    [imageView setImageWithURL:@"http://pic.cnitblog.com/avatar/572952/20140226185251.png"
              placeholderImage:[UIImage imageNamed:@"1.png"]];
}

@end

核心代码:

GCD部分就不讲解了,关键的一步是需要重绘view本身,这个涨知识了:)

除了下载图片,你还可以做其他操作呢:)

目录
相关文章
Egret学习笔记 (Egret打飞机-1.大致思路)   
Egret学习笔记 (Egret打飞机-1.大致思路)   
54 0
|
API iOS开发
iOS开发-SDWebImage的回调不addSubView不会调用
iOS开发-SDWebImage的回调不addSubView不会调用
61 0
iOS开发-SDWebImage的回调不addSubView不会调用
|
缓存 Android开发
Anroid笔记:Android图片加载框架Glide用法
Anroid笔记:Android图片加载框架Glide用法
169 0
|
缓存
SDWebImage探究
SDWebImage探究(一)SDWebImage探究(二)SDWebImage探究(三)SDWebImage探究(四)SDWebImage探究(五)SDWebImage探究(六) —— 图片类型判断深入研究SDWebImage探究(七) —— 深入研...
1029 0
|
存储 安全 Java
关于glide图片加载框架的实际使用要点
第一部分:先说用glide踩的坑。 最近在项目中,加载图片用的是glide框架,遇到坑的地方,在load(url),内的url不能丢了。比如: Glide.with(mContext)         .load("img2.3lian.com/2014/f6/173/d/55.jpg")         .into(ivOrderGoodsImg); 这样,图片无法显示,一般glide载入图片失败有几个原因,1:into()方法没有载入正确的ImageView控件,比如载入到TextView的实例化对象中;2:load()方法中的网址不正确。
1633 0
|
缓存 Android开发 设计模式
16.手写图片加载框架ImageLoader
概述 第三方开源的图片框架很多,这里自己去写一个的目的是通过这样一个写的过程,拓展自己对架构设计的理解,包括设计模式,线程,策略,缓存等等。另外大型的框架例如Glide,代码很完善,扩展性很高,但是阅读起来有难度,而实际上,这些框架底层实现原理都是类似的,所以通过构建一个简单框架的过程更加有助于对其原理的理解,算是为阅读复杂的第三方源码打下一个基础。
1086 0
|
Android开发 缓存 编解码
Android应用开发-图片加载库Glide
Glide Picasso和Glide之间的区别: Picasso 仅仅缓存了全尺寸的图像;然而 Glide 缓存了原始图像,全分辨率图像和另外小版本的图像。
904 0
|
缓存 Android开发 C++
android图片加载库Glide
什么是Glide? Glide是一个加载图片的库,作者是bumptech,它是在泰国举行的google 开发者论坛上google为我们介绍的,这个库被广泛的运用在google的开源项目中。 Glide解决什么问题? Glide是一个非常成熟的图片加载库,他可以从多个源加载图片,如:网路,本地,Uri等,更重要的是他内部封装了非常好的缓存机制并且在处理图片的时候能保持一
2318 0