参考SDWebImage的图片编解码的思路,SD在拿到图片data的时候并没有将它直接转为image对象,而是在子线程里面做了一个解码的操作,这样已经被解码的图片就赋值给imageView的时候就不会再进行解码,也就不会妨碍主线程了。
- (void)decodedImageWithImageName:(NSString *)imageName block:(void(^)(UIImage *image))block {
dispatch_async(dispatch_get_global_queue(0, 0), ^{
@autoreleasepool{
UIImage *image = [[UIImage imageNamed:imageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
image = [UIImage decodedImageWithImage:image];
dispatch_async(dispatch_get_main_queue(), ^{
if(block)
block(image);
});
}
});
}
代码实现很简单,就是将图片的操作放入到一个全局队列中,当然也可以自己创建一个队列去执行这个异步操作。decodedImageWithImage:为SD的代码,需要#import “SDWebImageDecoder.h”,具体实现网上对这一块的源码解释的比较多,很容易理解。