在开发过程中,难免遇到需要下载图片来进行展示的情况,而鉴于网络等因素的存在,有时候下载图片会很快,但有时就会很慢。这时候就不应该阻塞用户而进行图片下载。
下面写了两个子类,一个是UIImageView的子类,另一个是UIButton的子类,它们都能实现图片的异步下载展示。
本文Demo在Github上:https://github.com/gaussli/AsynImageViewAndButtonDemo
本文的思路来源于网上的开发者,具体是在哪里看见的就忘记了0.0 。 无论如何,感觉他们。
步骤:
1. 导入必要的文件
1)导入JHAsynView文件夹,其中AsynImageButton.h和AsynImageButton.m就是异步加载图片的UIButton子类;AsynImageView.h和AsynImageView.m就是异步加载图片的UIImageView子类;JHMacroDefinition.h为一些常量或函数的宏定义。
2)由于需要使用网络,这里我使用的是著名的网络开源项目ASIHTTPRequest,导入该项目。
3)还是网络的原因,导入系统框架:CFNetwork.framework和libz.dylib。
3)如需要一张默认图片,则新增一张,Demo中的默认图片是“default_image.png”。
2. 由于ASIHTTPRequest项目是非ARC的,于是需要到Build Phases --> Compile Sources 处把于该项目相关的类添加“-fno-objc-arc”的Compiler Flags
结果如下图:
3. 声明和初始化AsynImageView和AsynImageButton对象
// MainViewController.h文件中
@property (nonatomic, strong) AsynImageButton *button;
@property (nonatomic, strong) AsynImageView *imageView;
// MainViewController.m文件中
_button = [[AsynImageButton alloc] initWithFrame:CGRectMake(0, JH_STATUSBAR_HEIGHT, JH_SCREEN_WIDTH/2.0, JH_SCREEN_WIDTH/2.0)];
_imageView = [[AsynImageView alloc] initWithFrame:CGRectMake(0, JH_STATUSBAR_HEIGHT+JH_SCREEN_WIDTH/2.0+10, JH_SCREEN_WIDTH/2.0, JH_SCREEN_WIDTH/2.0)];
[_button initAsynImageWithPlaceholderImage:[UIImage imageNamed:@"default_image"] andImagePath:@"http://c.hiphotos.baidu.com/image/h%3D200/sign=b714c6e5d639b60052ce08b7d9513526/b58f8c5494eef01f98f3ddc3e3fe9925bd317dd5.jpg" andImageLocalPath:[JH_SANDBOX_DOCUMENTS_PATH stringByAppendingPathComponent:@"b58f8c5494eef01f98f3ddc3e3fe9925bd317dd5.jpg"]];
[_imageView initAsynImageWithPlaceholderImage:[UIImage imageNamed:@"default_image"] andImagePath:@"http://c.hiphotos.baidu.com/image/h%3D200/sign=946a240fb5003af352badb60052bc619/8d5494eef01f3a298f4c11c89a25bc315c607c34.jpg" andImageLocalPath:[JH_SANDBOX_DOCUMENTS_PATH stringByAppendingPathComponent:@"8d5494eef01f3a298f4c11c89a25bc315c607c34.jpg"]];
[self.view addSubview:_imageView];