iOS開發中SdWebImage可以說是作為圖片下載的利器,下面就大概說一下它的原理。
1.我們在調用圖片異步下載的方法的時候:
[self.goodsPic sd_setImageWithURL:[NSURL URLWithString:goodsM.pic1]];
在其內部實現中它都會首先去調用:
[self sd_cancelCurrentImageLoad];
它會先去查看視圖中,當前是否存在異步下載操作的緩存,如果有就取消掉(并且這個操作會對應一個特定的key值,例如在UIImageView里面它對應的是UIImageViewImageLoad);
2.在執行完[self sd_cancelCurrentImageLoad];
之后,下面的邏輯就是通過URL字符串作為key值去沙盒中查找是否有對應的圖片,有的話就顯示出來,沒有的話就要建立一個異步下載操作,去網絡下載,同時還有重要的一步,就是要把這個操作緩存起來
疑惑:為什么要去執行[self sd_cancelCurrentImageLoad];
?
是為了在Tableview中,解決cell數據顯示混亂的問題。因為我們在拖動TableView的時候,cell會不停的賦值新的數據,如果不將緩存的異步操作取消掉,有可能它會顯示其他行的數據,因為網絡下載有快慢,有可能上一個操作還沒下載完,而在前操作下載完成之后,上一個操作剛好下載完成,這時候數據相當于不對應了。
這也就是為什么我們要將異步操作緩存到字典中的原因,因為可以通過key值獲取到他,然后取消掉
個人覺的這也是為什么這個框架要用NSOperation的原因,因為它是基于GCD進行的封裝,更加面向對象,當緩存操作的時候,直接把異步操作對象緩存到字典就可以了。
并且里面用的是自定義NSOperation,當自定義NSOperation的時候,我們可以重寫它的main方法,在這個方法中把操縱分裝起來,同時在執行那些耗時的連續性操作的時候我們能來判斷當前的isCancel屬性是否為YES,如果是可以終止這個操作,這也是自定義NSOperation的好處。(因為如果用系統的的類來寫的話,一些已經開始了的耗時操作,你是無法取消的,能取消掉的只是那些將要執行的操作)