2013-02-15 48 views
17

Xin chào Tôi đang sử dụng khung công tác SDWebImage trong dự án và tôi muốn tải xuống và lưu hình ảnh, nhưng tôi nghĩ mã của tôi đang lưu trữ hình ảnh trong bộ nhớ cache hai lần? Có cách nào để lưu trữ hình ảnh trong bộ đệm ẩn chỉ bằng một khóa không? Đây là mã của tôi.SDWebImage Tải hình ảnh và lưu vào bộ nhớ cache cho khóa

  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]; 
      } 

      }]; 

Có điều gì mà tôi đã bỏ sót không? Dường như làm điều này trong công cụ phân bổ của tôi là pilling lên rất nhiều bộ nhớ.

Trả lời

23

Tôi ngạc nhiên khi không ai trả lời câu hỏi này, nhưng tôi đã có một câu hỏi tương tự và đã xem xét vấn đề này, vì vậy tôi sẽ trả lời câu hỏi này cho những người đang xem bài này (giả sử bạn đã tự mình sắp xếp bài này) .

Để trả lời trực tiếp câu hỏi của bạn, có, bạn đang lưu vào bộ nhớ cache hình ảnh hai lần.

Tải xuống cuộc gọi tới SDWebImageManager tự động lưu hình ảnh bằng các khóa dựa trên absoluteString của url của hình ảnh. Nếu bạn muốn khóa của riêng bạn, bạn có thể sử dụng cuộc gọi tải xuống trên SDWebImageDownloader mà theo như tôi có thể nói KHÔNG cache theo mặc định. Từ đó bạn có thể gọi sharedImageCache như bạn đã làm và cache với bất kỳ phím nào bạn muốn.

Điều đó sang một bên, thật lạ khi bạn thấy phân bổ chồng chất trong mọi trường hợp như SDWebImage thích lưu vào bộ nhớ cache và không phải là bộ nhớ nói chung. Có lẽ cái gì khác đang xảy ra cùng một lúc?

Hope this helps,

-Brandon

+0

gì bạn có nghĩa nếu chúng ta thiết lập quan trọng cho mỗi (cố định tải url hình ảnh), nó sẽ không xảy ra kích hoạt sự kiện tải trên mạng? đúng ? và nó sẽ sử dụng bộ đệm ẩn trước đó? –

+0

Được một lúc kể từ khi tôi nhìn vào điều này, nhưng nếu bạn đang có kế hoạch về lưu trữ một hình ảnh với một chìa khóa bộ nhớ cache cụ thể, bạn nên kiểm tra '[SDImageCache sharedImageCache]' cho hình ảnh trước khi đưa ra một yêu cầu tải về. Nếu bạn không có nó, lưu trữ nó với khóa cụ thể của bạn để nó sẽ có thời gian tới. Điều này có thể đã thay đổi ngay bây giờ, nhưng bạn nên sử dụng 'SDWebImageDownloader' và sau đó lưu trữ với khóa riêng của bạn nếu bạn đang đi để làm điều đó theo cách này. – Stakenborg

4

Hãy thử APSmartStorage (https://github.com/Alterplay/APSmartStorage) thay vì SDWebImage.

APSmartStorage lấy dữ liệu từ mạng và tự động lưu trữ dữ liệu trên đĩa hoặc trong bộ nhớ theo cách có thể cấu hình thông minh. Nên đủ tốt cho nhiệm vụ của bạn.

+0

Sẽ xem xét nó. Cảm ơn bạn – AgnosticDev

-1
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); 
    } 
}]; 
4

SDWebImage lưu hình ảnh vào cả đĩa và bộ nhớ. Hãy xem qua điều này:

  1. Bạn tải xuống hình ảnh từ url mới.
  2. Nó được lưu vào bộ nhớ và đĩa.
  3. Nếu bạn gọi hình ảnh trong cùng một phiên, nó sẽ được truy xuất từ ​​bộ nhớ.
  4. Giả sử bạn chạy lại ứng dụng và sau đó truy cập url, nó sẽ kiểm tra bộ nhớ, nơi ảnh sẽ không ở đó, sau đó nó sẽ kiểm tra đĩa và lấy nó từ đó. Nếu không, nó sẽ tải xuống.
  5. Hình ảnh vẫn nằm trong đĩa trong một tuần theo cài đặt tiêu chuẩn.

Vì vậy, bạn không cần phải lo lắng về bộ nhớ đệm. SDWebImage chăm sóc nó khá tốt.

Bạn có thể thực hiện tùy chỉnh để lưu bộ nhớ đệm cũng như làm mới hình ảnh từ bộ nhớ cache trong trường hợp bạn muốn cài đặt theo tiêu đề bộ nhớ đệm HTTP của bạn.

Bạn có thể tìm thấy chi tiết đầy đủ trên trang github của họ here.

12

Trong Swift sử dụng mã dưới đây để tải một hình ảnh và để lưu trữ nó trong bộ nhớ cache:

//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 
        } 
       } 
     }) 

Swift 3 phiên bản:

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 phiên bản :

[[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];  
        } 
       }]; 
+0

Cảm ơn bạn parth. Tôi chưa xem xét phiên bản Swift, nhưng phiên bản Swift có triển khai lớp SDWebImageDownloader để lưu hình ảnh của bạn bằng khóa tùy chỉnh thay vì URL không? – AgnosticDev

+0

Có phiên bản nhanh có lớp để lưu hình ảnh của bạn bằng khóa theo yêu cầu. Bạn có thể sử dụng mã bên dưới, SDImageCache.sharedImageCache(). StoreImage (image, forKey: "\ (file.attachmentFileName!) _ \ (File.fileId)") – parth

+0

Tuyệt vời! Hình ảnh được lưu trong bộ nhớ cache với khóa tùy chỉnh cuối cùng. – yuchen

0

// TẠO IMAGExem custome VÀ PASS URL hình ảnh bằng ARRAY (INDEXPATH.ROW)

(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; 

    }]; 
} 
Các vấn đề liên quan