2016-05-20 6 views
7

Ich versuche, ein neues Firebase-Projekt neu zu erstellen, in dem Sie eine Tabellenansicht mit Daten aus der Firebase-Echtzeitdatenbank füllen, die Verknüpfungen zu Bildern im Firebase-Speicher enthalten.Füllen einer Sammlungsansicht mit Firebase-Daten

Ich kann das Tutorial-Projekt, das eine Tabellenansicht mit Firebase-Daten ist, füllen. Bei meinem aktuellen Projekt handelt es sich jedoch um eine Sammlungsansicht innerhalb einer Erweiterung.

Ich habe

die Frage auf meine Variablen eingrenzen
var ref: FIRDatabaseReference! 
    var messages: [FIRDataSnapshot]! = [] 
    var msglength: NSNumber = 10 
    private var _refHandle: FIRDatabaseHandle! 

speziell

var messages: [FIRDataSnapshot]! = [] 

Was ich denke, dass ein Array meiner Daten, die ich von Feuerbasis

bekomme ich ein dann rufen Funktion, die dieses Array in meinem Viewdidload() füllen sollte

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) 
    }) 
} 

Das Problem tritt auf, wenn ich versuche, meine Sammlungen anzuzeigen, da ich horizontales Scrollen möchte, verwende ich eine Erweiterung. In der Erweiterung finde ich, dass mein Array von Werten immer 0 ist, aber in meiner Funktion loadPosts() ist die Anzahl von meinem> Array der gleiche Wert wie die Anzahl von Posts, die ich in Firebase habe.

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 
    } 
} 

Sollte ich nicht FIRDataSnapshot verwenden? Wenn ja, welches ist das richtige? Oder sollte ich das Projekt in einer anderen Form angehen, ohne Erweiterungen zu verwenden?

+0

Nachdem Sie die Objekte in Ihr Array eingefügt haben, rufen Sie reloadData() in Ihrem collectionView auf? –

+0

Oh wow, war ich nicht. Alles war einfach perfekt! Vielen Dank! @MacBellingrath – Mark

+0

Großartig! Ich werde eine Antwort posten. –

Antwort

6

Sie fügen die Elemente korrekt in Ihr Array innerhalb des Abschlussblocks ein, aber Sie verpassen einen Aufruf zum erneuten Laden Ihrer CollectionView.