Не срабатывает DataSource при CollectionView.reloadData() и collectionView - nil

swift
xcode
ios

#1

Ответ был дан на SO! Огромное всем спасибо за Ваше время и за Ваши мысли! Ответ: https://ru.stackoverflow.com/questions/1095023/Не-срабатывает-datasource-при-collectionview-reloaddata/1102592#1102592


Цель: Когда пользователей нажимает кнопку, получить результат из Firebase и отрисовать его в CollectionView.

Что сейчас: При первом заходе в приложения я делаю запрос к Firebase и получаю ответ, все отрисовывается как нужно, ячейки на месте, коллекция тоже. Ячейка у меня кастомная и сделана в .xib файле. Теперь когда я реализовал логику получения другой информации, я меняю только одно слово, чтобы данные получал из firebase уже другие. В дебагере проверил, массив который в DataSource после нажатия содержит новые данные, логика отработала, но после collectionView.reloadData() ничего не происходит. Ошибок нет. Только есть не делать проверку на nil, тогда да, приложуха падает на collectionView

По дебагеру: collectionView - nil , numberOfItemsInSection - не вызывается и ячейки не обновляются (тем самым и UI не обновляется)…

Что пробовал: Код получения данных был у меня в фоновом потоке, reloadData делал в главном, убрал потоки, потому что думал проблемы с потоками - не помогло. Пытался найти решения, в основном ответы были что-то типа: " Вы пытаетесь обновить данные в фоновом потоке" или “У вас коллекция не связанная с IB” и тд, не относятся к моей проблеме.

Код: Я постараюсь выложить то, что нужно.

// метод который срабатывает при получение интерактива от пользователя, как я сказал
// до строчки с reload все работает, а после ничего не происходит
    DispatchQueue.global(qos: .userInitiated).async {
            self.db.collection(K.FStore.collectionName!)
              .order(by: "date", descending: true)
              .addSnapshotListener { (querySnapshot, error) in

              if let e = error {
                  print("Ошибка при получение карточек \(e)")
              } else {
                  self.cards = []
                  if let snap = querySnapshot?.documents {
                     for item in snap {
                        let data = item.data()
                        if let fio = data[K.FStore.fullName] as? String, let price = data[K.FStore.price] as? String, let phone = data[K.FStore.phone] as? String, let description = data[K.FStore.description] as? String, let address = data[K.FStore.address] as? String {

                          let newCard = Card(fio: fio, phone: phone, price: price, description: description, address: address, idCard: item.documentID)  
                            self.cards.append(newCard)
                         }
                      }

                    DispatchQueue.main.async {
                       self.collectionView?.reloadData()
                    }
                }
            }
        }
    }
// self.cards - это массив Card, где есть определенная информация по карточке, потом Card я сделал в Cell ( т.е. кастомная ячейка - это карточка
// UICollectionViewDataSource
 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
       return cards.count
    }

//cellForItemAt
func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

       let cardCell: Card

       let cell = collectionView.dequeueReusableCell(withReuseIdentifier: K.cellMainScreenIndet, for: indexPath) as! MainCellCollectionView

       cardCell = cards[indexPath.row]

       cell.fioLabel.text = cardCell.fio
       cell.priceLabel.text = cardCell.price
       cell.addressLabel.text = cardCell.address
       cell.discriptionLabel.text = cardCell.description
       cell.phoneLabel.text = cardCell.phone

       return cell
   }

Надеюсь на Вашу помощь, так как новичок еще полный и не понимаю, где я ошибся и почему так работает язык!


#2

collectionView.dataSource = self есть?
и лучше скинь больше кода. Весь вью контроллер


#4

а зачем в self.collectionView?.reloadData() - ?
попробуй self.collectionView.reloadData()


#5

Будет краш приложения с ошибкой «collectionView is nil”


#6

тогда пробуй перепривязать аутлет


#7

у вас collectionView называется “collectionView” ?


#8

Всем спасибо за Ваше время и Ваши мысли! Дали верный ответ на SO: