Проблема с изображениями в CollectionView / TableView, загружаемая с сервера, не загружается в каждую ячейку сразу

У меня есть эта странная проблема, когда я загружаю изображения с Parse-Server с помощью простых запросов.

У меня есть этот класс под названием «Рецепты», и у меня есть эти столбцы.

Так что это мой код для загрузки рецептов из этого класса.

override func viewDidLoad() { super.viewDidLoad() queryRecipes("") } func queryRecipes(searchText:String) { self.recipesArray.removeAllObjects() let query = PFQuery(className: "Recipes") query.orderByDescending("createdAt") query.findObjectsInBackgroundWithBlock { (objects, error)-> Void in if error == nil { self.recipesArray = NSMutableArray(array: objects!) // Reload CollView self.recipesCollView.reloadData() self.view.hideHUD() // Hide/show the nothing found Label if self.recipesArray.count == 0 { self.nothingFoundLabel.hidden = false } else { self.nothingFoundLabel.hidden = true } } else { print(error) } } } 

И тогда код представления коллекции

  func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { return 1 } func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return recipesArray.count } func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCellWithReuseIdentifier("RecipesCell", forIndexPath: indexPath) as! RecipesCell var recipesClass = PFObject(className: "Recipes") recipesClass = recipesArray[indexPath.row] as! PFObject cell.titleLabel.text = "\(recipesClass["name"]!)" let imageFile = recipesClass["image"] as? PFFile cell.coverImage.file = imageFile cell.coverImage.loadInBackground(nil) cell.layer.shouldRasterize = true cell.layer.rasterizationScale = UIScreen.mainScreen().scale return cell } 

И внутри файла ячейки у меня есть следующее

 import UIKit import ParseUI class RecipesCell: UICollectionViewCell { /* Views */ @IBOutlet weak var coverImage: PFImageView! @IBOutlet weak var titleLabel: UILabel! } 

И из main.storyboard внутри изображения я установил этот класс. введите описание изображения здесь

Так что проблема в том, что у меня есть 10 изображений. Когда я перехожу к определенному виду, он показывает первые 4, что я вижу их в своем телефоне, и он загружает их хорошо. Но когда я прокручиваю вниз, чтобы увидеть больше в следующих 6 ячейках, это показывает, например

5-я ячейка -> изображение 1-й ячейки, а затем изображение 5-й ячейки. 6-я ячейка -> случайное изображение одной из других ячеек, и оно продолжается.

НО, когда я обновляюсь, я не вижу никакой реакции.

Кто-нибудь знает, почему это происходит? Я думаю, что мой код является законным, но я чего-то не хватает.

Спасибо за ваше время.

PS, Это происходит и для tableview.

PS2. Я тоже пробовал это. Внутри раскадровки я установил статическое изображение в uiimage, но он все еще заставляет эту вещь загружать разные изображения, а затем правильный.

Ячейки повторно используются, это означает, что когда вы удаляете один из них, он может возвращаться с другими данными в нем (он уже создан и теперь используется повторно). Поэтому вам нужно сделать «очистку» перед тем, как представить ее.

То же самое происходит и с текстом, а потому, что это не загрузка с сервера, или все, что вы не видите на экране.

Итак, что вам нужно сделать, это установить образ на образ заполнителя

 cell.coverImage.image = UIImage(named:"placeholder") 

прямо перед этой строкой:

 cell.coverImage.file = imageFile 

Надеюсь, это поможет. 🙂

Все это происходит потому, что ячейки повторно используются.

1. Ячейки повторно используются, поэтому вам нужно очистить / установить его по умолчанию, прежде чем его повторно использовать.

2. Ячейки повторно используются, и прокрутка может быть быстрее, чем выборка изображения с сервера: так что неправильный ответ завершения может произойти для неправильной ячейки! , Когда изображение заканчивается загрузкой, вам нужно проверить, должна ли ячейка загружать изображение, или была ли она повторно использована в это время (это означает, что загружает другое изображение – так что это может вызвать флэш-память, о которой вы упомянули).

 let imageFile = recipesClass["image"] as? PFFile cell.coverImage.image = nil // 1. Clearing the cell // or as in Abavisg's answer you load the default image instead of nil cell.coverImage.file = imageFile // This is kind of pseudocode as I'm not familiar with the Parses' API cell.coverImage.loadInBackground() { loadedImage in // 2. Here you have to check if the loadedImage is the right image // for the cell if ( loadedImage.imageFile == imageFile) { //loadTheImage } else { //skipLoadingTheImage -> The cell was reused } } 
  • NSURLSession и кеш изображений
  • Проблемы с объектом (словарь), который я получаю из NSUserDefaults
  • Ошибка при настройке google analytics в swift 2 и xcode 7 beta 4
  • Как передать функцию с неизвестными параметрами и вернуть значение в качестве параметра в Swift
  • Работа. Потяните, чтобы обновить с отключенным отскоком.
  • UITests, соединяющий заголовочный файл, не добавляется в Xcode
  • UICollectionView показывается, но ячейки не отображаются в быстрых
  • Сплит-метод в swift 2.0 (XCode 7 beta 5)
  • Тема 1: EXC_BAD_ACCESS (код: 1, адрес: 0x70) в быстрой
  • Как мы можем инициализировать свойства «let» динамически в своем конструкторе в Swift
  • Динамически проверять тип объекта в Swift 2
  • Interesting Posts

    SceneKit rayTestWithSegmentFromPoint, hitResults всегда nil

    UIPageViewController в XIB-ошибке

    Насколько хорошо тесты Xcode 7 UI интегрируются с Xcode Bots? Показывает ли этапы тестирования пользовательского интерфейса?

    Приложение iPad не запускается в ландшафтном режиме и получает часть черного экрана при запуске в ландшафтном режиме

    Как опубликовать видеофайл в Интернете, чтобы передать его в приложение с помощью быстрого доступа?

    Экран приветствия при запуске

    Вперед UIAlertView нажмите на другой cotroller

    Строка состояния, маржа навигационной панели

    Программа cocos2d с низким кадром

    ADAL iOS с CocoaPods v0.38 с использованием Swift без перекрестного заголовка

    Нет достаточной ячейки для использования в UITableView

    Вызов кода последовательно после dispatch_async

    Можно ли изменить размер раздела с анимацией в IGListSectionController?

    Вычислить таблицуHeaderView height с автозапуском

    Внедрение API Google Диска с помощью входа в Google – iOS

    Давайте будем гением компьютера.