2012-10-17 80 views
9

之前我獲取了很多從網上的圖片,而且都是那種規模的 - 他們可以是大,小等。SDWebImage處理圖像緩存

所以我可以調整它們的大小,當我在顯示它們細胞,但這是低效的。在SDWebImage下載它們並緩存它們的大小後,調整它們的大小會更好,而不是將大圖像存儲在磁盤上併爲每個單元調整大小。

那麼我該如何使用SDWebImage來做到這一點,或者我必須對該類進行一些修改?

回答

4

我和你有同樣的問題,並嘗試先調整SDWebImage,但最終建立了自己的組件來解決問題。你可以在這裏看看它:https://github.com/adig/RemoteImageView

+0

這是偉大的!圖書館幹得不錯。有一些煩惱,比如在每個reloadData消息上重新加載圖像,或者在每個表滾動中重新出現圖像。你可以看看這個。謝謝,祝賀! – Devfly

+0

感謝您的反饋。如果您在圖像加載時指向動畫序列,則可以使用animate屬性禁用該動畫序列。 – adig

+0

好的,我已經實現了。 – Devfly

24

SDWebImage開發人員Olivier Poitrey回答了這個問題對我here

您必須實現SDWebImageManagerDelegate協議,然後將其設置爲共享經理的委託是這樣的:

SDWebImageManager.sharedManager.delegate = self; 

using the imageManager:transformDownloadedImage:withURL: instance method. 

More information.

完全爲我工作。

+1

這真棒!非常感謝你指點我正確的方向。 – kleo

+0

抱歉沒有得到。我爲每個單元格的圖像使用UIImageView + WebCache.h類的sd_setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)佔位符方法。我該怎麼做,你可以用通俗的話來說。 –

0

SDWebImage 3.8.2

如果使用的UIImageView類sd_setImageWithURL。我已經創造了另一個的UIImageView類(擴展)

func modifiedImageFromUrl(url: NSURL?) { 
    self.sd_setImageWithURL(url) { (image, error, cacheType, url) in 
     if cacheType == SDImageCacheType.None && image != nil { 
      dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)) { 
       let modifiedImage = // modify image as you want 

       dispatch_async(dispatch_get_main_queue()) { 
        SDWebImageManager.sharedManager().saveImageToCache(modifiedImage, forURL: url) 

        self.image = modifiedImage 
       } 
      } 
     } 
    } 
} 
0

斯威夫特3對大師的回答擴展:

myImageView.sd_setImage(with: imageUrl){ (image, error, cacheType, url) in 
    guard let image = image, cacheType == .none else { return } 

    DispatchQueue.global(qos: .userInitiated).async { 
     let modifiedImage = myImageProcessor(image) 
     SDWebImageManager.shared().saveImage(toCache: modifiedImage, for: imageUrl) 
     DispatchQueue.main.async { 
      myImageView.image = modifiedImage 
      myImageView.setNeedsDisplay() 
     } 
    } 
}