2015-06-13 3 views
0

Я использую SDWebImage для асинхронного скачивания и кеширования изображений в UITableView, но у меня возникают некоторые проблемы.SDWebImage Library - placeholder from URL

Сценарий следующий: Когда ячейка создана, я хочу загрузить изображение с низким качеством размытого изображения (1-2кб) с URL-адреса, прежде чем появится реальное изображение. После загрузки изображения более высокого качества я хочу показать это. До сих пор я попробовал эти варианты, но ни один, кажется, работает так, как я ожидал:

1:

SDWebImageManager *manager = [SDWebImageManager sharedManager]; 
    [manager downloadImageWithURL:[NSURL URLWithString:lowQualityImageURL] 
          options:0 
         progress:^(NSInteger receivedSize, NSInteger expectedSize) {} 
         completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { 

          if (finished) { 
           cell.pictureView.image = image; 
           [manager downloadImageWithURL:[NSURL URLWithString:highQualityImageURL] 
                 options:0 
                progress:^(NSInteger receivedSize, NSInteger expectedSize) {} 
                completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) { 
                 if (image && finished) { 
                  [UIView transitionWithView:cell.pictureView 
                       duration:0.1f 
                       options:UIViewAnimationOptionTransitionCrossDissolve 
                      animations:^{ 
                       cell.pictureView.image = image; 
                      } completion:^(BOOL finished) { 

                      }]; 
                 } 
                }]; 
          } 
         }]; 

При использовании этого кода, качество изображения низкое, кажется, можно загрузить и , но если пользователь быстро прокручивается в таблице, он будет иметь неправильные изображения для некоторых ячеек (из-за повторного использования ячеек). - Любое решение здесь?

2:

[cell.pictureView sd_setImageWithURL:[NSURL URLWithString:lowQualityImageURL] placeholderImage:[UIImage new] options:SDWebImageRefreshCached completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { 
      [cell.pictureView sd_setImageWithURL:[NSURL URLWithString:highQualityImageURL] placeholderImage:image options:SDWebImageRefreshCached completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { 

      }]; 
    }]; 

Этот подход, кажется, исправить «неправильный образ для ячейки» вопрос, но большинство клеток в конечном итоге, показывая их соответствующие помутнение изображения istead изображения высокого качества, которые, как предполагается, чтобы показать ,

Итак, подведите итог, есть ли у вас совет о том, как я могу достичь результата, который я хочу? (скачайте изображение низкого качества -> покажите его до загрузки изображения высокого качества -> замените его высококачественным изображением)

LE: При использовании второго подхода я вижу странное поведение. Выход консоли:

  1. набор пальца для ячейки: 1

  2. реального набора изображений для ячейки: 1

  3. набора большого пальца для ячейки: 2

  4. пальца Набора для ячейки: 3

  5. большой палец набор для ячейки: 0

  6. реального изображения, установленное для ячейки: 0

Оказывается, что какой-то образом, некоторые из загрузки отменены.

ответ

0

В итоге я использовал два UIImageViews, по одному на каждую фотографию, наложенные. Когда реальное (большое) изображение полностью загружается, я плавно стираю размытое изображение.

0

Вот вспомогательная функция, я писал в Swift с помощью Nuke:

func loadImageWithTwoQualities(lowQualityURL: NSURL, highQualityURL: NSURL, completion: (UIImage) ->()) { 

    Nuke.taskWith(lowQualityURL) { 
     completion($0.image!) 

     Nuke.taskWith(highQualityURL) { 
      completion($0.image!) 
     }.resume() 

    }.resume() 
} 

Вы можете использовать его с любым типом зрения изображения так:

let normalImageUrl = NSURL(string: picture)! 
let largeImageUrl = NSURL(string: picture + "?type=large")! 

loadImageWithTwoQualities(normalImageUrl, highQualityURL: largeImageUrl) { image in 
    self.someUIButton.setBackgroundImage(image, forState: .Normal) 
}