iOS TableViewCell判斷不同網絡狀態顯示圖片(SDWebImage的使用)

分類:技術 時間:2017-01-13

產品需求:自定義的UITableViewCell上有圖片需要顯示,要求網絡網絡狀態為WiFi時,顯示圖片高清圖;網絡狀態為蜂窩移動網絡時,顯示圖片縮略圖。如下圖樣例:

首先,要監聽網絡狀態,一般用AFNetWorking。

一般在AppDelegate.m文件中的application:didFinishLaunchingWithOptions:方法中監聽網絡狀態。這里是判斷當前網絡的狀態,然后再按網絡的狀態下載不同的圖片。

用SDWebImange下載圖片直接調用下面方法即可:

[self.imageView sd_setImageWithURL:[NSURLURLWithString:item.originalImage] placeholderImage:placeholder];

是不是感覺這樣很簡單?這樣幾句代碼就搞定了。既判斷了網絡狀態,還對應的作出了不同網絡下載圖片不一樣的圖片。

但是真實開發中,為了提高用戶體驗,并盡可能的減少用戶流量的耗費等,就要考慮很多需要注意的細節:

1)SDWebImage會自動幫助開發者緩存圖片(包括內存緩存,沙盒緩存),所以我們需要設置用戶在WiFi環境下下載的高清圖,下次在蜂窩網絡狀態下打開應用也應顯示高清圖,而不是去下載縮略圖。

2)許多應用設置模塊帶有一個功能:移動網絡環境下仍然顯示高清圖。這個功能其實是將設置記錄在沙盒中。

3)當用戶處于離線狀態時候,無法合理處理業務。

要考慮到上述情況就得注意作出一下判斷:

做出這樣的判斷問題就真的解決了嗎?因為tableViewCell有重用機制,所以這樣簡單的判斷還是會出現顯示的問題。

比如,當用戶所處環境WiFi網速不夠快(不能立即將圖片下載完畢),而在上述代碼,在WiFi環境下又是下載高清大圖。所以需要一定的時間來完成下載。而就在此時,用戶不愿等,想看看上次打開App時顯示的圖片,此時用戶會滑到處于下面的cell來查看。注意:此時,上面的cell下載圖片操作并沒有暫停,還在處于下載圖片狀態中。當用戶在查看上次打開App的顯示圖片時(上次打開App下載完成的圖片,SDWebImage會幫我們緩存,不用下載),而正好需要顯示上次打開App時的圖片的cell是利用tableView重用機制而從緩存池中拿出來的cell,等到處于上面的cell的高清大圖已經下載好了的時候,SDWebImage默認做法是,立馬把下載好的圖片設置給ImageView,所以我們這時候會在底下的顯示的cell顯示上面的圖片,造成數據錯亂,這是非常嚴重的BUG。

解決方法就是:

如果能在cell被從緩存池中拿出來使用的時候,將這個cell放入緩存池之前的下載操作移除,那么就不會出現數據錯亂了。

但是這里下載圖片都是SDWebImage做的,但其實SDWebImage在下載圖片之前,就已先關閉imageView當前的下載操作。

所以,只需要把所有的直接訪問本地緩存代碼利用SDWebImage進行設置就可以了。

這樣,你所擔心的問題全部都解決了。

代碼下載

喜歡記得給顆:heart:。


Tags: SDWebImage

文章來源:http://www.jianshu.com/p/06e909705556


ads
ads

相關文章
ads

相關文章

ad