Заполните представление коллекции данными Firebase

Я пытаюсь воссоздать новый проект firebase, в котором вы заполняете табличное представление данными из базы данных firebase в реальном времени, которые содержат ссылки на изображения в хранилище firebase.

Я могу заполнить учебный проект, который представляет собой табличное представление с данными Firebase. Но в моем текущем проекте это представление коллекции внутри расширения.

Я сузил проблему до моих переменных

  var ref: FIRDatabaseReference!
  var messages: [FIRDataSnapshot]! = []
  var msglength: NSNumber = 10
  private var _refHandle: FIRDatabaseHandle!

конкретно

var messages: [FIRDataSnapshot]! = []

Я думаю, что это массив моих данных, которые я получаю от firebase

Затем я вызываю функцию, которая должна заполнить этот массив в моем viewdidload().

func loadPosts(){
    self.messages.removeAll()
    // Listen for new messages in the Firebase database
    _refHandle = self.ref.child("messages").observeEventType(.ChildAdded, withBlock: { (snapshot) -> Void in
        //print("1")
        self.messages.append(snapshot)
        //print(self.messages.count)
    })
}

Проблема возникает, когда я пытаюсь заполнить представление своих коллекций, так как мне нужна горизонтальная прокрутка, я использую расширение. В расширении я обнаружил, что мой массив значений всегда равен 0, но в моей функции loadPosts() количество моих > массивов равно количеству сообщений, которые у меня есть в firebase.

extension HomeViewController : UICollectionViewDataSource
{

func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
    return 1
}

func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return messages.count
}

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    print(messages.count)

    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(StoryBoard.CellIdentifier, forIndexPath: indexPath) as! InterestCollectionViewCell

    // Unpack message from Firebase DataSnapshot
    let messageSnapshot: FIRDataSnapshot! = self.messages[indexPath.row]
    let message = messageSnapshot.value as! Dictionary<String, String>
    let name = message[Constants.MessageFields.name] as String!
    if let imageUrl = message[Constants.MessageFields.imageUrl] {
        if imageUrl.hasPrefix("gs://") {
            FIRStorage.storage().referenceForURL(imageUrl).dataWithMaxSize(INT64_MAX){ (data, error) in
                if let error = error {
                    print("Error downloading: \(error)")
                    return
                }
                cell.featuredImageView?.image = UIImage.init(data: data!)
            }
        } else if let url = NSURL(string:imageUrl), data = NSData(contentsOfURL: url) {
            cell.featuredImageView?.image = UIImage.init(data: data)
        }
        cell.interestTitleLabel?.text = "sent by: \(name)"
    }
        return cell
    }
}

Не следует ли мне использовать FIRDataSnapshot? Если да, то какой правильный использовать? Или я должен подойти к проекту в другой форме, не используя расширения?


person Mark    schedule 20.05.2016    source источник
comment
После того, как вы вставите объекты в свой массив, вы вызываете reloadData() в своем collectionView?   -  person Mac Bellingrath    schedule 20.05.2016
comment
Ого, я не был. Все просто отлично заселено! Благодарю вас! @МакБеллинграт   -  person Mark    schedule 20.05.2016
comment
Большой! Я собираюсь опубликовать ответ.   -  person Mac Bellingrath    schedule 20.05.2016
comment
извините, можете ли вы предоставить код обновления с помощью self.collectionView.reloadData() и где именно он называется?   -  person Famic Tech    schedule 04.11.2016


Ответы (1)


Вы правильно вставляете элементы в свой массив в блоке завершения, но вам не хватает вызова для перезагрузки вашего collectionView.

person Mac Bellingrath    schedule 20.05.2016