2016-05-20 8 views
7

Sto tentando di ricreare un nuovo progetto Firebase in cui si popola una vista tabella con i dati del database in tempo reale di Firebase che contengono collegamenti alle immagini nella memoria di Firebase.Popolare una vista insieme con i dati firebase

Posso popolare il progetto tutorial che è una vista tabella con i dati firebase. Ma con il mio progetto attuale si tratta di una vista insieme all'interno di un'estensione.

Ho ridotto la questione a mio variabili

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

specificamente

var messages: [FIRDataSnapshot]! = [] 

Che credo sia un allineamento dei miei dati che ricevo da Firebase

Ho poi chiamo un funzione che dovrebbe popolare quella matrice nel mio 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) 
    }) 
} 

Il problema si verifica quando provo a popolare la vista delle raccolte poiché voglio lo scorrimento orizzontale. Uso un'estensione. Nell'estensione trovo che il mio array di valori è sempre 0, ma nella mia funzione loadPosts() il conteggio del mio> array è lo stesso valore della quantità di post che ho in 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 
    } 
} 

dovrei non essere utilizzare FIRDataSnapshot? Se è così qual è quella giusta da usare? O dovrei avvicinarmi al progetto in un'altra forma che non usa estensioni?

+0

Dopo aver inserito gli oggetti nell'array, stai chiamando reloadData() sul tuo insiemeView? –

+0

Oh wow, non lo ero. Tutto è appena popolato perfettamente! Grazie! @MacBellingrath – Mark

+0

Grande! Ho intenzione di pubblicare una risposta. –

risposta

6

Si stanno inserendo correttamente gli elementi nell'array all'interno del blocco di completamento, ma manca una chiamata per ricaricare la raccoltaView.