下載狀態(tài)維護:本地
1.為什么本地保存下載狀態(tài)。
因為本地文件被刪除,服務(wù)器是不知道的钾埂,所以無法記錄。(安卓是可以從文件夾刪除)
2.手動退出和后臺退出造成異常科平。
1.手動退出: 假設(shè)處于下載中褥紫,手動退出應(yīng)用。此時的下載狀態(tài)應(yīng)該更新為未下載(沒有斷點續(xù)傳)匠抗。
2.后臺退出同理: 長時間處于后臺被系統(tǒng)殺死故源。解決法案:1.通過appDelegate回調(diào)監(jiān)聽捕捉事件。
2.在app啟動時候汞贸,數(shù)據(jù)初始化绳军。
3.本地實現(xiàn)方案:
本地存儲方案:1.數(shù)據(jù)庫。
2.key-value最佳解決方案:使用數(shù)據(jù)庫:下載url-> 下載狀態(tài)->本地存儲文件路徑矢腻。
對應(yīng)表結(jié)構(gòu):
url | status | destinationUrl |
---|---|---|
http:url | 0 | 文件路徑 |
根據(jù)url找到對應(yīng)下載狀態(tài)门驾,并且取到下載路徑內(nèi)容。
UI的更新:Cell的改變
1.cell重用導(dǎo)致下載狀態(tài)錯亂多柑。
因為重用機制:cell上的下載狀態(tài)會錯亂奶是。
例子:屏幕未出現(xiàn)的cell狀態(tài):未下載。屏幕第一條數(shù)據(jù)是下載中竣灌。cell重用聂沙,造成屏幕未出現(xiàn)的cell狀態(tài)錯亂為下載中。所以必須從model中時時更新初嘹。
2.cell下載狀態(tài):第一次初始化和下載點擊及汉。
既然用本地數(shù)據(jù)記錄,就要第一次從數(shù)據(jù)庫拿到初始數(shù)據(jù)屯烦。
既然用cell重用坷随,就要保證model中數(shù)據(jù)更新(內(nèi)存中)房铭。
造成問題:model數(shù)據(jù)來自網(wǎng)絡(luò),下載狀態(tài)數(shù)據(jù)來自本地温眉。解決方案:下載狀態(tài)的更新統(tǒng)一來自model的數(shù)據(jù)缸匪,可以為model添加一個字段status。第一次網(wǎng)絡(luò)獲取model時候类溢,從本地拿到狀態(tài)為model賦值凌蔬。當(dāng)點擊下載時候,根據(jù)下載情況豌骏,更新對應(yīng)model的status龟梦。并監(jiān)聽model的status,更新cell的界面變化窃躲。
并發(fā)數(shù)的控制
1.NSOperationQuene
Quene有屬性maxConcurrentOperationCount最大并發(fā)數(shù)控制。
注意:只需保證NSOperationQuene初始化一次钦睡。
NSOperationQuene的理解:可以看作一條管道蒂窒,每個操作看作一段水流。(遵循先入先出原則)荞怒;并發(fā)數(shù)的控制類似蓄水池洒琢。
1.并發(fā)數(shù)為1:蓄水池有一個管子(NSOperationQuene)流入水池。只有一個水管(并發(fā)數(shù)的控制)流出水褐桌。此時只開啟一個異步線程衰抑。
2.并發(fā)數(shù)為10:蓄水池有一個管子(NSOperationQuene)流入水池。同時10個水管(并發(fā)數(shù)的控制)流出水荧嵌。此時開啟10個異步線程呛踊。
下邊是還沒來得及實現(xiàn):