2017-02-21 40 views
0

У меня есть rss-канал, полученный через this third party library. У меня проблема при прокрутке таблицы. Всякий раз, когда я прокручиваю вниз, текст надписи меняется, но через некоторое время изображение меняется. Во время этого короткого промежутка в несколько секунд я вижу предыдущий образ этой строки. Я хочу, чтобы изображение по умолчанию просматривалось, если оно загружается в бэкэнд.Стоп Синхронная загрузка изображения в виде таблицы

Код, используемый для получения этой отложенной загрузки в их демо является:

func loadImageSynchronouslyFromURLString(_ urlString: String) -> UIImage? { 
    if let url = URL(string: urlString) { 
     let request = NSMutableURLRequest(url: url) 
     request.timeoutInterval = 30.0 
     var response: URLResponse? 
     let error: NSErrorPointer? = nil 
     var data: Data? 
     do { 
      data = try NSURLConnection.sendSynchronousRequest(request as URLRequest, returning: &response) 
     } catch let error1 as NSError { 
      error??.pointee = error1 
      data = nil 
     } 
     if (data != nil) { 
      return UIImage(data: data!) 
     } 
    } 
    return nil 
} 

Ниже приведен код, из которого эта функция вызывался:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "FeedItemCell", for: indexPath) as UITableViewCell 
     let item = entries![(indexPath as NSIndexPath).row] 
if let imageView = cell.viewWithTag(1) as? UIImageView { 
      if item.mainImage != nil { 
       imageView.image = item.mainImage 
      } else { 
       if item.imageURLsFromDescription == nil || item.imageURLsFromDescription?.count == 0 { 
        item.mainImage = UIImage(named: "roundedDefaultFeed") 
        imageView.image = item.mainImage 
       } 
       DispatchQueue.global(qos: DispatchQoS.QoSClass.default).async(execute: {() -> Void in 
        for imageURLString in item.imageURLsFromDescription! { 
         if let image = self.loadImageSynchronouslyFromURLString(imageURLString) { 
          item.mainImage = image 
          DispatchQueue.main.async(execute: {() -> Void in 
           imageView.image = image 
           self.tableView.reloadRows(at: [indexPath], with: .automatic) 
          }) 
          break; 
         } 
        } 
       }) 
      } 
     } 
    return cell 
} 

Пожалуйста, скажите мне, как показать пустое пространство при загрузке pic после прокрутки.

+0

Используйте 'asyn' для загрузки данных. Показывать изображение по умолчанию в вашем «imageView», пока ваши данные не будут получены с сервера. –

+0

Используйте сторонний класс [SDWebImage] (https://github.com/rs/SDWebImage). – Ronak

+0

@the_dahiya_boy вы можете привести пример? – Dia

ответ

3

UITableViewCell s используются повторно для улучшения производительности, избегая создания экземпляра ячейки. Вот почему вы видите «последнее» изображение, пока загрузка не закончится, и ваше «новое» изображение не будет установлено.

UITableViewCell имеет метод, называемый prepareForReuse(), который вызывается перед повторным использованием ячейки.

Чтобы устранить проблему:

UITableViewCell Подкласс и переопределить prepareForReuse() и (пере) установить изображение с места держателя изображения.

или:

Установите заполнитель изображения в cellForRowAt:indexPath:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "FeedItemCell", for: indexPath) as UITableViewCell 
    let item = entries![(indexPath as NSIndexPath).row] 
    if let imageView = cell.viewWithTag(1) as? UIImageView { 

     imageView = myPlaceholderImage // set the placeholder you want to see while downloading the image 

     if item.mainImage != nil { 
      ... 
      // your original code 
     } 

    return cell 
} 
+0

Пожалуйста, проверьте отредактированный вопрос – Dia

+0

Мой ответ должен исправить ошибку «Всякий раз, когда я прокручиваю текст ярлыка, меняется, но через какое-то время изображение меняется. В течение этого короткого промежутка в несколько секунд я вижу предыдущее изображение этой строки ....») , Описание ошибки не изменило свойства. 'reloadRows' не следует называть btw. – shallowThought

+0

Как я могу использовать этот метод prepareForReuse в моем контроллере? – Dia

 Смежные вопросы

  • Нет связанных вопросов^_^