解決tableView復用錯亂問題
- 每次都會調UIImageView+WebCache文件中的 [self sd_cancelCurrentImageLoad];
原理解釋參考
SDWebImageDownloader
- 圖片的下載操作放在一個NSOperationQueue并發(fā)操作隊列中,隊列默認最大并發(fā)數是6
- 每個圖片對應一些回調(下載進度,完成回調等),回調信息會存在downloader的URLCallbacks(一個字典,key是url地址,value是圖片下載回調數組)中,URLCallbacks可能被多個線程訪問,所以downloader把下載任務放在一個barrierQueue中,并設置屏障保證同一時間只有一個線程訪問URLCallbacks。,在創(chuàng)建回調URLCallbacks的block中創(chuàng)建了一個NSOperation并添加到NSOperationQueue中
- 下載的核心是利用NSURLSession加載數據,每個圖片的下載都有一個operation操作來完成,并將這些操作放到一個操作隊列中,這樣可以實現圖片的并發(fā)下載。
- 內存緩存的處理由NSCache對象實現,NSCache類似一個集合的容器,它存儲key-value對,類似于nsdictionary類,我們通常使用緩存來臨時存儲短時間使用但創(chuàng)建昂貴的對象,重用這些對象可以優(yōu)化新能,同時這些對象對于程序來說不是緊要的,如果內存緊張就會自動釋放。
- 先在內存中放置一份緩存,如果需要緩存到磁盤,將磁盤緩存操作作為一個task放到串行隊列中處理,會先檢查圖片格式是jpeg還是png,將其轉換為響應的圖片數據,最后吧數據寫入磁盤中(文件名是對key值做MD5后的串)。