SDWebImage Pobierz obraz i zapisz do pamięci podręcznej dla klucza

Witam używam frameworka SDWebImage w projekcie i chcę pobrać i buforować obrazy, ale myślę, że mój kod przechowuje obraz w pamięci podręcznej dwa razy? Czy jest jakiś sposób, aby zapisać obraz w pamięci podręcznej za pomocą klucza tylko raz? Oto Mój kod.

         SDWebImageManager *manager = [SDWebImageManager sharedManager];
         [manager downloadWithURL:[NSURL URLWithString:url] options:0 progress:^(NSUInteger receivedSize, long long expectedSize) {

          } completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished) {

            if(image){
                NSString *localKey = [NSString stringWithFormat:@"Item-%d", i];
                [[SDImageCache sharedImageCache] storeImage:image forKey:localKey];
            }

          }];  
Czy coś mnie ominęło? Wygląda na to, że robienie tego w moim instrumencie przydziela dużo pamięci.
Author: Mike Beeler, 2013-02-15

11 answers

Dziwię się, że nikt nie odpowiedział na to pytanie, ale miałem podobne pytanie i natknąłem się na to, więc odpowiem na nie dla osób oglądających to w przyszłości(zakładając, że już sam to załatwiłeś).

Aby odpowiedzieć bezpośrednio na twoje pytanie, tak, buforujesz obraz dwa razy.

Pobieranie wywołań do SDWebImageManager automatycznie buforuje obrazy za pomocą klawiszy na podstawie bezwzględnego adresu URL obrazu. Jeśli chcesz mieć swój własny klucz, możesz użyć połączenia pobierania na SDWebImageDownloader, który o ile mogę powiedzieć, domyślnie nie buforuje. Stamtąd możesz wywołać sharedImageCache, jak już to robisz i buforować za pomocą dowolnego klucza, który chcesz.

To na marginesie, dziwne, że widzisz alokacje piętrzące się w każdym przypadku, ponieważ SDWebImage lubi buforować na dysk, a nie pamięć ogólnie. Może dzieje się coś jeszcze w tym samym czasie?

Hope this helps,

-Brandon

 29
Author: Stakenborg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-22 19:04:30

In Swift użyj poniższego kodu, aby pobrać obraz i zapisać go w pamięci podręcznej:

//SDWebImageManager download image with High Priority 

    SDWebImageManager.sharedManager().downloadImageWithURL(NSURL(string: imageUrl), options: SDWebImageOptions.HighPriority, progress: { (receivedSize :Int, ExpectedSize :Int) in
            SVProgressHUD.show()
            }, completed: { (image :UIImage!, error:NSError!, cacheType :SDImageCacheType, finished :Bool,imageUrl: NSURL!) in
                if(finished) {
                    SVProgressHUD.dismiss()
                    if((image) != nil) {
                        //image downloaded do your stuff
                    }
                }
        })

Wersja Swift 3 :

SDWebImageManager.shared().downloadImage(with: NSURL(string: "...") as URL!, options: .continueInBackground, progress: { 
(receivedSize :Int, ExpectedSize :Int) in

}, completed: { 
(image : UIImage?, error : Error?, cacheType : SDImageCacheType, finished : Bool, url : URL?) in

})

Objective-C Wersja:

[[SDWebImageDownloader sharedDownloader] downloadImageWithURL:[NSURL URLWithString:imageUrl] options:SDWebImageDownloaderUseNSURLCache progress:nil completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) {

                    if (image && finished) {
                        // Cache image to disk or memory
                        [[SDImageCache sharedImageCache] storeImage:image forKey:CUSTOM_KEY toDisk:YES];     
                    }
                }]; 
 22
Author: parth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-19 05:09:02

Swift 4:

SDWebImageManager.shared().loadImage(
        with: URL(string: imageUrl),
        options: .highPriority,
        progress: nil) { (image, data, error, cacheType, isFinished, imageUrl) in
          print(isFinished)
      }
 7
Author: Bogdan Bystritskiy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-21 12:09:00

SWIFT 5 & najnowszy SDWebImage 5.2.3

SDWebImageManager.shared.loadImage(
    with: album.artUrlFor(imageShape: .square),
    options: .continueInBackground, // or .highPriority
    progress: nil,
    completed: { [weak self] (image, data, error, cacheType, finished, url) in
        guard let sself = self else { return }

        if let err = error {
            // Do something with the error
            return
        }

        guard let img = image else {
            // No image handle this error
            return
        }

        // Do something with image
    }
)
 6
Author: DoesData,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-10-10 16:12:43

SDWebImage buforuje obraz zarówno na dysk, jak i pamięć. Przejdźmy przez to:

  1. pobierasz obraz z nowego adresu url.
  2. jest buforowany na pamięć i dysk.
  3. Jeśli wywołasz obraz w tej samej sesji, zostanie on pobrany z pamięci.
  4. Załóżmy, że ponownie uruchomisz aplikację, a następnie uzyskasz dostęp do adresu url, sprawdzi pamięć, gdzie nie będzie obrazu, a następnie sprawdzi dysk i stamtąd pobierze. Jeśli nie, pobierze go.
  5. The obraz pozostaje na dysku przez tydzień według standardowego ustawienia.

Więc nie musisz się martwić o buforowanie. SDWebImage dba o to cholernie dobrze.

Możesz wykonać niestandardową implementację buforowania, a także odświeżyć obraz z pamięci podręcznej w przypadku, gdy chcesz, aby ustawienia były zgodne z nagłówkiem buforowania HTTP.

Możesz znaleźć pełne szczegóły na ich stronie github tutaj .

 5
Author: Gautam Jain,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-24 10:21:04

Spróbuj tego dla Swift 4.0 .

let url = URL(string: imageUrl!)

SDWebImageManager.shared().imageDownloader?.downloadImage(with: url, options: .continueInBackground, progress: nil, completed: {(image:UIImage?, data:Data?, error:Error?, finished:Bool) in
     if image != nil {. 

     }
})
 5
Author: reza_khalafi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-19 09:12:12

Wypróbuj APSmartStorage ( https://github.com/Alterplay/APSmartStorage ) zamiast SDWebImage.

APSmartStorage pobiera dane z sieci i automatycznie buforuje dane na dysku lub w pamięci w inteligentny, konfigurowalny sposób. Powinno wystarczyć na twoje zadanie.

 4
Author: slatvick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-10 13:42:05

Tak można pobrać obraz za pomocą SDWebImage i zapisać go w pamięci lokalnej ręcznie .

Pobrany obraz przechowuje się w pamięci lokalnej używając SDWebImage

func saveImage(url: URL, toCache: UIImage?, complation: @escaping SDWebImageNoParamsBlock) {
    guard let toCache = toCache else { return }

    let manager = SDWebImageManager.shared()
    if let key = manager.cacheKey(for: url) {
        manager.imageCache?.store(toCache, forKey: key, completion: complation)
    }
}

Załaduj obraz z pamięci za pomocą adresu URL obrazu

static func imageFromMemory(for url: String) -> UIImage? {
    if let encoded = url.addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed),
        let url = URL(string: encoded) {
        let manager = SDWebImageManager.shared()
        if let key: String = manager.cacheKey(for: url),
            let image = manager.imageCache?.imageFromMemoryCache(forKey: key) {
            return image
        }
    }
    return nil
}
 1
Author: AshvinGudaliya,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-14 11:39:30

//UTWÓRZ CUSTOME IMAGEVIEW I PRZEKAŻ ADRES URL OBRAZU ZA POMOCĄ TABLICY (INDEXPATH.Wiersz)

(void) loadImage:(NSString *)imageLink{

    imageLink = [imageLink stringByReplacingOccurrencesOfString:@" " withString:@"%20"];

    SDWebImageManager *manager = [SDWebImageManager sharedManager];

    [manager loadImageWithURL:[NSURL URLWithString:imageLink] options:SDWebImageDelayPlaceholder progress:^(NSInteger receivedSize, NSInteger expectedSize, NSURL * _Nullable targetURL) {

    } completed:^(UIImage * _Nullable image, NSData * _Nullable data, NSError * _Nullable error, SDImageCacheType cacheType, BOOL finished, NSURL * _Nullable imageURL) {

        imageFrame.image = image;

    }];
}
 0
Author: Slimshady,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-14 21:49:15

Swift 5.1

import UIKit
import SDWebImage

extension UIImageView{
    func downloadImage(url:String){
      //remove space if a url contains.
        let stringWithoutWhitespace = url.replacingOccurrences(of: " ", with: "%20", options: .regularExpression)
        self.sd_imageIndicator = SDWebImageActivityIndicator.gray
        self.sd_setImage(with: URL(string: stringWithoutWhitespace), placeholderImage: UIImage())
    }
}

Jak stosować

let myUrl = "https://www.example.com"
myImageView.downloadImage(url: myUrl)

 0
Author: Rashid Latif,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-29 10:52:34
SDWebImageManager *manager = [SDWebImageManager sharedManager];

[manager downloadImageWithURL:ImageUrl options:0 progress:^(NSInteger receivedSize, NSInteger expectedSize)

{


} completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {

    if(image){


        NSLog(@"image=====%@",image);
    }
}];
 -1
Author: Kausik Jati,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-17 11:50:58