作者:Mitchell
一他巨、有關(guān)圖片下載的邏輯
- 圖片下載
- 重復(fù)下載問(wèn)題
- 定義字典保存下載好的圖片
- 磁盤(pán)緩存問(wèn)題
- 內(nèi)存沒(méi)有嘗試從磁盤(pán)獲取
- 阻塞主線程問(wèn)題
- 新建NSOperationQueue下載圖片
- 重復(fù)設(shè)置問(wèn)題
- reloadRowsAtIndexPaths
- 重復(fù)下載問(wèn)題
邏輯1 - 從來(lái)沒(méi)下載過(guò)
1.查看內(nèi)存緩存是否有圖片
2.查看磁盤(pán)緩存是否有圖片
3.查看時(shí)候有任務(wù)正在下載當(dāng)前圖片
4.開(kāi)啟任務(wù)下載圖片
5.寫(xiě)入磁盤(pán)
6.緩存到內(nèi)存
7.移除下載操作
8.顯示圖片
邏輯2 - 已經(jīng)下載過(guò)
1.查看內(nèi)存緩存是否有圖片
2.查看磁盤(pán)緩存是否有圖片
3.使用磁盤(pán)緩存
4.將圖片緩存到內(nèi)存中
5.更新UI
邏輯3 - 已經(jīng)下載過(guò), 并且不是重新啟動(dòng)
1.查看內(nèi)存緩存是否有圖片
2.更新UI
二、iOS目錄結(jié)構(gòu)
-
Documents
- 需要保存由"應(yīng)用程序本身"產(chǎn)生的文件或者數(shù)據(jù)劲装,例如:游戲進(jìn)度凌那、涂鴉軟件的繪圖
- 目錄中的文件會(huì)被自動(dòng)保存在 iCloud
- 注意:不要保存從網(wǎng)絡(luò)上下載的文件兼雄,否則會(huì)無(wú)法上架!
-
Caches
- 保存臨時(shí)文件帽蝶,"后續(xù)需要使用"赦肋,例如:緩存圖片,離線數(shù)據(jù)(地圖數(shù)據(jù))
- 系統(tǒng)不會(huì)清理 cache 目錄中的文件
- 就要求程序開(kāi)發(fā)時(shí)励稳,"必須提供 cache 目錄的清理解決方案"
-
Preferences
- 用戶偏好佃乘,使用 NSUserDefault 直接讀寫(xiě)!
- 如果要想數(shù)據(jù)及時(shí)寫(xiě)入磁盤(pán)驹尼,還需要調(diào)用一個(gè)同步方法
-
tmp
- 保存臨時(shí)文件趣避,"后續(xù)不需要使用"
- tmp 目錄中的文件,系統(tǒng)會(huì)自動(dòng)清理
- 重新啟動(dòng)手機(jī)新翎,tmp 目錄會(huì)被清空
- 系統(tǒng)磁盤(pán)空間不足時(shí)程帕,系統(tǒng)也會(huì)自動(dòng)清理
對(duì)目錄的封裝
- (NSString *)cacheDir
{
// 1.獲取cache目錄
NSString *dir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
return [dir stringByAppendingPathComponent:[self lastPathComponent]];
}
- (NSString *)documentDir {
NSString *dir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
return [dir stringByAppendingPathComponent:[self lastPathComponent]];
}
- (NSString *)tmpDir {
NSString *dir = NSTemporaryDirectory();
return [dir stringByAppendingPathComponent:[self lastPathComponent]];
}
三、SDWebImage的架構(gòu)
-
SDWebImageManager
- SDImageCache
- SDWebImageDownloader
- SDWebImageDownloaderOperation
-
默認(rèn)緩存時(shí)間多少
- 一周
-
緩存的地址
- NSString *fullNamespace = [@"com.hackemist.SDWebImageCache." stringByAppendingString:ns];
-
cleanDisk如何清理過(guò)期圖片
- 刪除早于過(guò)期日期的文件
- 保存文件屬性以計(jì)算磁盤(pán)緩存占用空間
- 如果剩余磁盤(pán)緩存空間超出最大限額地啰,再次執(zhí)行清理操作愁拭,刪除最早的文件
-
clearDisk如何清理磁盤(pán)
- 刪除緩存目錄
- 新建緩存目錄
-
SDWebImage如何播放圖片
- 取出gif中每一幀, 生成一張可動(dòng)畫(huà)圖片
-
SDWebImage如何判斷圖片類型
- 判斷圖片二進(jìn)制前8個(gè)字節(jié)
- kPNGSignatureBytes[8] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A};
四、關(guān)于 CocoaPods
-
CocoaPods 是什么?
- CocoaPods 是開(kāi)發(fā) OS X 和 iOS 應(yīng)用程序的一個(gè)第三方庫(kù)的依賴管理工具亏吝。利用 CocoaPods,可以定義自己的依賴關(guān)系 (稱作 pods),并且隨著時(shí)間的變化,以 及在整個(gè)開(kāi)發(fā)環(huán)境中對(duì)第三方庫(kù)的版本管理非常方便
-
CocoaPods 背后的理念主要體現(xiàn)在兩個(gè)方面
- 在工程中引入第三方代碼 會(huì)涉及到許多內(nèi)容岭埠。針對(duì) Objective-C 初級(jí)開(kāi)發(fā)者來(lái)說(shuō),工程文件的配置會(huì)讓 人很沮喪
- 在配置buildphases和linker flags過(guò)程中,會(huì)引起許多人為因素的 錯(cuò)誤
- CocoaPods 簡(jiǎn)化了這一切,它能夠自動(dòng)配置編譯選項(xiàng)
-
CocoaPods的原理
- 它是將所有的依賴庫(kù)都放到另一個(gè)名為Pods項(xiàng)目中,然后 讓主項(xiàng)目依賴Pods項(xiàng)目,這樣,源碼管理工作都從主項(xiàng)目移到了Pods項(xiàng)目中
- 1、Pods項(xiàng)目最終會(huì)編譯成一個(gè)名為libPods.a的文件,主項(xiàng)目只需要依賴這個(gè).a 文件即可。
- 2枫攀、對(duì)于資源文件,CocoaPods提供了一個(gè)名為Pods-resources.sh的bash腳本, 該腳本在每次項(xiàng)目編譯的時(shí)候都會(huì)執(zhí)行,將第三方庫(kù)的各種資源文件復(fù)制到目 標(biāo)目錄中括饶。
- 3、CocoaPods通過(guò)一個(gè)名為Pods.xcconfig的文件來(lái)在編譯時(shí)設(shè)置所有的依賴和 參數(shù)。
-
CocoaPods安裝
- 更新gem
- sudo gem update --system
- 更新ruby的軟件源
- gem sources --remove https://rubygems.org/
- gem sources -a http://ruby.taobao.org/
- gem sources -l
- 安裝CocoaPods
- sudo gem install cocoapods
- 替換CocoaPods的鏡像索引
- pod repo remove master
- pod repo add master http://git.oschina.net/akuandev/Specs.git
- pod repo add master https://gitcafe.com/akuandev/Specs.git
- pod repo update
- 設(shè)置 pod 倉(cāng)庫(kù)
- pod setup
- 測(cè)試
- pod --version
- 更新gem
-
卸載CocoaPods
- sudo gem uninstall cocoapods
-
CocoaPods使用:
- 使用時(shí)需要新建一個(gè)名為Podfile的文件
- 將依賴的庫(kù)名字依次列在文件中
platform :ios
pod'AFNetworking'
- 注釋事項(xiàng)
- 1.利用CocoPods管理類庫(kù)后, 以后打開(kāi)項(xiàng)目就用xxxx.xcworkspace 打開(kāi),而不是 之前的.xcodeproj文件
- 2.每次更改了Podfile文件,你需要重新執(zhí)行一次pod update命令点弯。
- 3.CocoaPods在執(zhí)行pod install和pod update時(shí),會(huì)默認(rèn)先更新一次CocoPods的 spec倉(cāng)庫(kù)索引僚稿。使用--no-repo-update參數(shù)可以禁止其做索引更新操作
pod install --no-repo-update
pod update --no-repo-update