一开始接触到图片的加载是使用SDWebImage这个三方库, 然后就养成了惰性, 工作中一碰到网络图片的加载, 就毫不犹豫的把SDWebImage拖进来, 其实由于工程的使用限制, 往往导入了一大堆三方库文件, 真是有价值的就那么一个函数.
实现原理也很简单, 先把占位图片赋给UIImageView, 然后用GCD创建一个新的线程来异步加载图片, 加载图片数据就用最简单方法, NSData的远程加载方法:
最近查看公司工程源码, 导入的三方库是在太多, 当然也包括SDWebImage, 同样我查了一下, 这个库的真正用途就那么一个异步加载图片的函数. 于是就决定自己封装一个异步加载网络图片的类别.
UIImageView+MHImageWebCache.h 就一个api:
@interface UIImageView (MHImageWebCache)
/*!
* @author Macro QQ:778165728, 15-10-14
*
* @brief 加载网络图片
*
* @param urlStr 网络图片地址
* @param imageName 未加载时的占位图片
*/
- (void)setWebImageWithUrlStr:(NSString *)urlStr placeholderImageName:(NSString *)imageName;
@end
实现原理也很简单, 先把占位图片赋给UIImageView, 然后用GCD创建一个新的线程来异步加载图片, 加载图片数据就用最简单方法, NSData的远程加载方法:
+ (nullable instancetype)dataWithContentsOfURL:(NSURL *)url;
加载完成之后, 就通知主线程(UI线程)修改UI, 我之前没考虑这点, 图片加载很长时间才显示出来....
// 通知主线程更新UI
dispatch_async(dispatch_get_main_queue(), ^{
self.image = [UIImage imageWithData:imageData];
});
这样图片数据加载完成, 就会马上更新到UI上了~