導讀
現(xiàn)在有很多APP的tabbar上的圖標在做活動時,都是在可以在服務器獲取數(shù)據(jù)的跷敬,我們平常下載圖片都是用的sdwebimage等第三方庫坚洽,但是里面沒有對于tabbaritem的下載圖片的方法辑舷。不自定義tabbar的話宇智,只能自己給tabbaritem寫個從網(wǎng)絡獲取圖片的功能了。
實現(xiàn)方案
1.按照sdwebimage的設計思路瑞筐,需要給tabbaritem寫一個UITabBarItem+WebCache的分類凄鼻,拓展2個下載圖片的方法(選中和非選中)。
- (void)zy_setImageWithURL:(NSString *)urlString withImage:(UIImage *)placeholderImage
- (void)zy_setSelectImageWithURL:(NSString *)urlString placeholderImage:(UIImage *)placeholderImage
2.需要一個圖片下載緩存器去協(xié)助UITabBarItem+WebCache去完成此功能聚假。還是模仿sdwebimage块蚌,根據(jù)傳入的url,依次從內(nèi)存膘格、本地峭范、網(wǎng)絡獲取image,第一次從網(wǎng)絡下載到圖片時闯袒,在內(nèi)存和本地都保存起來虎敦。獲取到image都不往下執(zhí)行了,實現(xiàn)如下:
- (void)zy_setImageWithURL:(NSString *)urlString withImage:(UIImage *)placeholderImage {
//1.從內(nèi)存中加載圖片
UIImage *image = [[ZYImageCacheManager sharedImageCacheManager] imageFromDictionary:urlString];
if (image) {
//內(nèi)存有圖片政敢,就只接使用圖片
self.image = [self scaleImage:[image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] toScale:0.5];
} else {
//內(nèi)存沒有圖片其徙,就從本地讀區(qū)圖片
image = [[ZYImageCacheManager sharedImageCacheManager] imageFromLocal:urlString];
if (image) {
//從本地讀取到了圖片,就直接使用
self.image = [self scaleImage:[image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] toScale:0.5];
//保存圖片到內(nèi)存中
[[ZYImageCacheManager sharedImageCacheManager] setImage:image withURL:urlString];
} else {
//從本地沒有讀取到圖片喷户,從網(wǎng)絡下載
[[ZYImageCacheManager sharedImageCacheManager] imageFromNetwork:urlString complete:^(UIImage *image) {
//圖片下載完成后的操作
//使用圖片
self.image = [self scaleImage:[image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal] toScale:0.5];
if (image == NULL) {
self.image = [placeholderImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
return;
}
//加載到內(nèi)存
[[ZYImageCacheManager sharedImageCacheManager] setImage:image withURL:urlString];
//加載到本地
[[ZYImageCacheManager sharedImageCacheManager] saveImage:image withURL:urlString];
}];
}
}
}
我將ZYImageCacheManager設置成一個單例類唾那,方便控制在內(nèi)存中的圖片,實現(xiàn)如下方法:
//從內(nèi)存中加載圖片
- (UIImage* )imageFromDictionary:(NSString* )key;
//從本地加載圖片
- (UIImage* )imageFromLocal:(NSString* )urlString;
//從網(wǎng)絡加載圖片褪尝,因為是異步下載闹获,方法結(jié)束的時候圖片還沒有下載完成,我們沒有數(shù)據(jù)返回
- (void)imageFromNetwork:(NSString* )urlString complete:(complete)complete;
//保存圖片到內(nèi)存中
- (void)setImage:(UIImage* )image withURL:(NSString* )urlString;
//保存圖片到本地
- (void)saveImage:(UIImage* )image withURL:(NSString* )urlString;
3.緩存到內(nèi)存中河哑,是將URLString作為key將image對象設置到字典中避诽;緩存到本地是將URLString進行md5加密(因為url里面包含“/”,為了消除它)作為圖片名字存到沙盒中璃谨;下載圖片沙庐,這里使用多線程異步并發(fā)去下載:
- (void)imageFromNetwork:(NSString *)urlString complete:(complete)complete {
//異步下載圖片
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
//從網(wǎng)絡獲取數(shù)據(jù)
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:urlString]];
//從二進制生成圖片
UIImage *image = [UIImage imageWithData:data];
//切回主線程
dispatch_async(dispatch_get_main_queue(), ^{
if (complete) {
complete(image);
}
});
});
}
4.同時要注意內(nèi)存大小鲤妥,防止內(nèi)存警告。
//接受一下內(nèi)存警告
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(clearImageCache) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
- (void)clearImageCache {
//清空緩存釋放內(nèi)存
[_imageCache removeAllObjects];
NSString *path = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches/ImageCache"];
[[NSFileManager defaultManager] removeItemAtPath:path error:nil];
}
具體代碼見我的github:https://github.com/zouyongfeng/UITabbarItem
star一下吧