// 偽代碼
if(1.根據圖片的url去圖片緩存images中取圖片){
將圖片顯示到cell上
} else{
if(2.檢查沙盒中是否存在對應的圖片){
2.1將從沙盒中加載的圖片顯示到cell上
2.2保存一份到內存中
} else{
顯示占位圖片
if(3.根據圖片的url查看操作緩存operation中是否存在下載操作){
提示正在下載
} else{
4創建下載操作
4.1將圖片放到圖片緩存images中
4.2將圖片存入到沙盒中
4.3刷新表格
4.4將操作從操作緩存operation中移除
5把操作保存到操作緩存operation中
6把下載操作添加到隊列中執行
}
}
}
- 知識點
-
UITableView
展示數據
- 創建模型類描述plist文件
- 加載plist文件
- 字典轉模型
- 獲取文件的沙盒路徑
- 根據沙盒路徑從沙盒中存取數據
- 刷新
UITableView
指定行的數據
- 設置占位圖片
- 內存緩存(圖片緩存和操作緩存)
- 使用
NSMutableDictionary
做緩存操作
- NSOperation和線程間通信相關知識
- 程序的容錯處理
- 問題和對應的解決方案
- 圖片的重復下載問題
- UI不流暢
- 開子線程下載圖片時出現的問題
- 圖片不顯示
- 原因:在獲取到圖片后在主線程中只是設置了cell的imageView的image屬性,并沒有做到真正的刷新UI操作
- 解決:在獲取到圖片后在主線程中使用tableView的
reloadRowsAtIndexPaths: withRowAnimation:
方法刷新指定行
- 重復下載
- 原因:當網速比較慢,用戶滑動比較快時,圖片來不及下載完成,用戶就又請求下載圖片
- 解決:操作緩存(使用
NSMutableDictionary
做操作緩存)
- 數據錯亂
- 程序的容錯處理問題
- 原因:當圖片的icon錯誤時,不能下載到對應的圖片,但是在把圖片寫入到緩存之前沒有做判斷,此時會把nil寫入到緩存中,而緩存中的數據是以字典的形式保存的,不能有空值,所以程序會報錯
- 解決:在把圖片寫入到緩存之前先做判斷,如果沒有圖片就把下載圖片的操作從操作緩存中移除并返回,程序不再繼續往下執行;如果有圖片就做圖片緩存操作
- 應用沙盒結構分析
- 應用程序包
-
Documents
- 保存應用運行時生成的需要持久化的數據
- 該目錄下的數據在同步時會備份
-
temp
- 保存應用運行時需要的臨時數據
- 該目錄下的數據在同步時不會備份,應用運行完畢后會清楚該目錄下的數據
-
Library/Caches
- 保存應用運行時生成的需要持久化的數據
- 該目錄下的數據在同步時不會備份
- 一般存儲體積大、不需要備份的非重要數據
-
Library/Preference
- 保存應用的所有偏好設置
- 該目錄下的數據在同步時會備份
- 獲取文件的沙盒路徑
-(NSString *)getFullPath:(NSString *)urlStr
{
//caches
NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
//獲得文件名稱
NSString *fileName = [urlStr lastPathComponent];
//拼接文件的全路徑
NSString *fullPath = [caches stringByAppendingPathComponent:fileName];
return fullPath;
}
- 圖片可以寫入到緩存中,但是不能寫入到沙盒中,要想把圖片寫入到到沙盒中,只能通過把圖片的二進制數據寫入到沙盒中的方法來實現
最后編輯于 :
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。