iOS中SDWebImage怎么用?
由于要監(jiān)聽網(wǎng)絡(luò)狀態(tài),在這里筆者推薦使用AFNetWorking。
1)在GitHub或者利用cocoaPod給項(xiàng)目導(dǎo)入第三方框架AFNetWorking。
2)在AppDelegate.m文件中的application:didFinishLaunchingWithOptions:方法中監(jiān)聽網(wǎng)絡(luò)狀態(tài)。
// AppDelegate.m 文件中
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// 監(jiān)控網(wǎng)絡(luò)狀態(tài)
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
}
// 以下代碼在需要監(jiān)聽網(wǎng)絡(luò)狀態(tài)的方法中使用
AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];
if (mgr.isReachableViaWiFi) { // 在使用Wifi, 下載原圖
} else { // 其他,下載小圖
}
}
這時就會有iOS學(xué)習(xí)者開始抱怨:這不是很簡單嗎?于是三下五除二寫完了以下代碼。
// 利用MVC,在設(shè)置cell的模型屬性時候,下載圖片
- setItem:(CustomItem *)item
{
_item = item;
UIImage *placeholder = [UIImage imageNamed:@“placeholderImage”];
AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];
if (mgr.isReachableViaWiFi) { // 在使用Wifi, 下載原圖
?。踫elf.imageView sd_setImageWithURL:[NSURL URLWithString:item.originalImage] placeholderImage:placeholder];
} else { // 其他,下載小圖
?。踫elf.imageView sd_setImageWithURL:[NSURL URLWithString:item.thumbnailImage] placeholderImage:placeholder];
}
}
此時,確實(shí)能完成基本的按照當(dāng)前網(wǎng)絡(luò)狀態(tài)下載對應(yīng)的圖片,但是真實(shí)開發(fā)中,這樣其實(shí)是不合理的。以下是需要注意的細(xì)節(jié):
1)SDWebImage會自動幫助開發(fā)者緩存圖片(包括內(nèi)存緩存,沙盒緩存),所以我們需要設(shè)置用戶在WiFi環(huán)境下下載的高清圖,下次在蜂窩網(wǎng)絡(luò)狀態(tài)下打開應(yīng)用也應(yīng)顯示高清圖,而不是去下載縮略圖。
2)許多應(yīng)用設(shè)置模塊帶有一個功能:移動網(wǎng)絡(luò)環(huán)境下仍然顯示高清圖。這個功能其實(shí)是將設(shè)置記錄在沙盒中,關(guān)于數(shù)據(jù)保存到本地,可以查看本人另一篇簡書首頁文章:iOS本地數(shù)據(jù)存取,看這里就夠了。
3)當(dāng)用戶處于離線狀態(tài)時候,無法合理處理業(yè)務(wù)。
于是,開始加以改進(jìn)。為了讓讀者你更容易理解,我先貼出偽代碼:
- setItem:(CustomItem *)item
{
_item = item;
if (緩存中有原圖)
{
self.imageView.image = 原圖;
} else
{
if (Wifi環(huán)境)
{
下載顯示原圖
} else if (手機(jī)自帶網(wǎng)絡(luò))
{
if (3G\4G環(huán)境下仍然下載原圖)
{
下載顯示原圖
} else
{
下載顯示小圖
}
} else
{
if (緩存中有小圖)
{
self.imageView.image = 小圖;
} else // 處理離線狀態(tài)
{
self.imageView.image = 占位圖片;
}
}
}
}
實(shí)現(xiàn)上面的偽代碼:讀者可以一一對應(yīng)上面的偽代碼。練習(xí)的時候推薦先寫偽代碼,再寫真實(shí)代碼
多多注意“注釋”解釋。
- setItem:(CustomItem *)item
{
_item = item;
// 占位圖片
UIImage *placeholder = [UIImage imageNamed:@“placeholderImage”];
// 從內(nèi)存\沙盒緩存中獲得原圖,
UIImage *originalImage = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:item.originalImage];
if (originalImage) { // 如果內(nèi)存\沙盒緩存有原圖,那么就直接顯示原圖(不管現(xiàn)在是什么網(wǎng)絡(luò)狀態(tài))
self.imageView.image = originalImage;
} else { // 內(nèi)存\沙盒緩存沒有原圖
AFNetworkReachabilityManager *mgr = [AFNetworkReachabilityManager sharedManager];
if (mgr.isReachableViaWiFi) { // 在使用Wifi, 下載原圖
?。踫elf.imageView sd_setImageWithURL:[NSURL URLWithString:item.originalImage] placeholderImage:placeholder];
} else if (mgr.isReachableViaWWAN) { // 在使用手機(jī)自帶網(wǎng)絡(luò)
// 用戶的配置項(xiàng)假設(shè)利用NSUserDefaults存儲到了沙盒中
// [[NSUserDefaults standardUserDefaults] setBool:NO forKey:@“alwaysDownloadOriginalImage”];
// [[NSUserDefaults standardUserDefaults] synchronize];
#warning 從沙盒中讀取用戶的配置項(xiàng):在3G\4G環(huán)境是否仍然下載原圖
BOOL alwaysDownloadOriginalImage = [[NSUserDefaults standardUserDefaults] boolForKey:@“alwaysDownloadOriginalImage”];
if (alwaysDownloadOriginalImage) { // 下載原圖
[self.imageView sd_setImageWithURL:[NSURL URLWithString:item.originalImage] placeholderImage:placeholder];
} else { // 下載小圖
?。踫elf.imageView sd_setImageWithURL:[NSURL URLWithString:item.thumbnailImage] placeholderImage:placeholder];
}
} else { // 沒有網(wǎng)絡(luò)
UIImage *thumbnailImage = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:item.thumbnailImage];
if (thumbnailImage) { // 內(nèi)存\沙盒緩存中有小圖
self.imageView.image = thumbnailImage;
} else { // 處理離線狀態(tài),而且有沒有緩存時的情況
self.imageView.image = placeholder;
}
}
}
}
解決了嗎?真正的坑才剛剛開始。
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%
下載地址
iOS中SDWebImage怎么用?下載
相關(guān)電子資料下載
- iOS17.1可能明天發(fā)布,iOS17.1主要修復(fù)哪些問題? 380
- 華為全新鴻蒙蓄勢待發(fā) 僅支持鴻蒙內(nèi)核和鴻蒙系統(tǒng)應(yīng)用 719
- 蘋果手機(jī)系統(tǒng)iOS 17遭用戶質(zhì)疑 731
- iPhone12輻射超標(biāo)?蘋果推送iOS 17.1解決此事 750
- 傳華為囤積零部件 目標(biāo)明年智能手機(jī)出貨7000萬部;消息稱 MiOS 僅限國內(nèi),小米 28208
- 蘋果推送iOS17.0.3,解決iPhone15Pro系列存在機(jī)身過熱 216
- Testin云測兼容和真機(jī)服務(wù)平臺中上線iPhone 15系列手機(jī) 208
- 利爾達(dá)推出搭載HooRiiOS的Matter模組 145
- 運(yùn)放參數(shù)解析:輸入偏置電流(Ibias)和失調(diào)電流(Ios) 128
- 昆侖太科發(fā)布支持國產(chǎn)飛騰騰銳D2000芯片的開源BIOS固件版本 448