有一次給一個坑爹的項目救場,裝載之後隨便點幾個頁面,20M流量木有了,坑爹呀。後來發現問題之所在,服務器端沒有縮略圖,所以不管看列表還是點詳情都是大圖,這個問題服務器端做了處理就好了。客戶端的問題很嚴重,就是每次浏覽圖片都要從服務器端下載一次,這不費流量才怪呢,不知道之前那哥哥收了移動多少好處費。不過這種情況普遍存在,我見過很多應用甚至一些所謂的知名網站知名電商也存在這種情況。
我當時的解決方案很簡單:服務器端保證圖片不會重名,客戶端根據服務器端返回的文件名判斷本地是否存在該文件,如果有直接打開本地圖片,如果沒有就下載到本地再打開。以下是代碼
// 下載文件到Documents中並返回路徑
+ (NSString *)saveFileToDocuments:(NSString *)url
{
NSString *resultFilePath = @"";
if (url.length > 7) {// 本應用服務器端的域名是7位,所以先判斷url是否正確
NSString *destFilePath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:[url substringFromIndex:7]]; // 去除域名,組合成本地文件PATH
NSString *destFolderPath = [destFilePath stringByDeletingLastPathComponent];
// 判斷路徑文件夾是否存在不存在則創建
if (! [[NSFileManager defaultManager] fileExistsAtPath:destFolderPath]) {
[[NSFileManager defaultManager] createDirectoryAtPath:destFolderPath withIntermediateDirectories:YES attributes:nil error:nil];
}
// 判斷該文件是否已經下載過
if ([[NSFileManager defaultManager] fileExistsAtPath:destFilePath]) {
resultFilePath = destFilePath;
} else {
NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:url]];
if ([imageData writeToFile:destFilePath atomically:YES]) {
resultFilePath = destFilePath;
}
}
}
return resultFilePath;
}
方法有很多,解決浪費用戶流量才是關鍵問題。作為一個開發人員,不能只想著代碼怎樣好寫怎樣寫,應該考慮考慮怎樣讓用戶好用怎樣做。