2016-04-01 3 views
0

Ich habe eine UICollectionView, wo ich Daten unter Verwendung einer Klasse auffüllen. Ab sofort befülle ich es mit Dummy-Daten, wie im folgenden Code gezeigt. Ich habe versucht, diese Dummy-Daten durch Daten aus meiner Firebase-Datenbank zu ersetzen.Wie man Firebase-Daten mit einer Klasse zurückgibt?

import UIKit 

class MrNobody 
{ 
// MARK: - Public API 
var title = "" 
var description = "" 
var numberOfMembers = 0 
var numberOfPosts = 0 
var featuredImage: UIImage! 

init(title: String, description: String, featuredImage: UIImage!) 
{ 
    self.title = title 
    self.description = description 
    self.featuredImage = featuredImage 
    numberOfMembers = 1 
    numberOfPosts = 1 
} 

// MARK: - Private 
// dummy data 
static func createMrNobody() -> [MrNobody] 
{ 
    return [ 
     MrNobody(title: "some text" , description: "some text", featuredImage: UIImage(named: "r1")!), 
     MrNobody(title: "some text" , description: "some text", featuredImage: UIImage(named: "r1")!), 
     MrNobody(title: "some text" , description: "some text", featuredImage: UIImage(named: "r1")!), 

    ] 
} 
} 

Um Daten aufzunehmen, ich habe import Firebase enthalten, meine Firebase Datenbank identifiziert mit let ref = Firebase(url: "my app url") und Lesen von Daten unter Verwendung von

ref.observeEventType(.Value, withBlock: { snapshot in 
print(snapshot.value) 
}, withCancelBlock: { error in 
print(error.description) 
}) 

Ich bin in der Lage, die Child-Daten zu lesen, aber ich bin nicht in der Lage zu sein um es im return Block der Funktion zu verwenden. Idealerweise würde ich enumerator = snapshot.childrenCount verwenden und die return Funktion retirativ für so viele Kinder verwenden, die sich in dem Knoten von Interesse befinden.

Jede Hilfe/Richtung wird sehr geschätzt.

+0

Hey OP, ich weiß, dass deine Frage bereits beantwortet wurde, aber ich würde dich ermutigen, einfach einen Initialisierer in der 'MrNobody'-Klasse zu machen nimmt einen 'FDataSnapshot'. Dies ist eine gute Vorgehensweise, da es die Wiederverwendbarkeit von Code ermöglicht, falls Sie diese Snapshots an mehreren Stellen im Code verwenden müssen (z. B. wenn Sie die Ereignistypen '.ChildAdded' und' .ChildRemoved' hören). –

Antwort

1

Der Funktionsaufruf createMrNobody() ist synchron und verhält sich beim Abrufen von Daten aus Firebase nicht auf die gleiche Weise.

Firebase ist von Natur aus asynchron. Wenn Sie also nach Daten fragen, müssen Sie darauf warten, dass diese Daten abgerufen werden, bevor Sie sie verarbeiten. Andernfalls wird der Verarbeitungscode ausgeführt, bevor Firebase die Daten bereithält.

Es ist anders als eine SQL-Abfrage von Funktionsaufruf, wo der gesamte Prozess synchron ist.

Nicht sicher, ob das hilft, aber hier ist ein Beispiel: Angenommen, wir haben ein Array, das Personen speichert, und wir müssen es von Firebase auffüllen.

Wir definieren zuerst die Person Klasse

class Person { 
     var title: NSString? 
     var aDescription: NSString? 
    } 

und das Array die Leute zu speichern

var myArray = [Person]() 

und wenn Sie bereit sind, sie von Firebase zu laden, dies wird es tun

func loadMyPeople() { 

    myUsersRef.observeSingleEventOfType(.Value, withBlock: { snapshot in 

     for child in snapshot.children { 
      let title = child.value["title"] as! String 
      let description = child.value["description"] as! String 
      let dude = Person() 
      dude.title = title 
      dude.aDescription = description 
      self.myArray.append(dude) 
     } 

     //after all your people are loaded in the array, print it's contents 
     // you could also reload a tableView here as well. 
     for dude in self.myArray { 
      print("email: \(dude.title!) desc: \(dude.description!)") 
     } 
    }) 
} 
+0

Danke. Ich konnte dieses Rezept verwenden, um Daten von der Firebase-Datenbank zu meinem TableView zu lesen. Nur der Vollständigkeit halber musste ich 'title: NSString, description: NSString' zu 'title =" ", description =" "' in der Class-Datei ändern. Sonst bekam ich einen Fehler "lldb: Found nil beim Auspacken des optionalen" -Fehlers. – KuboAndTwoStrings

+0

@AtlasShrugged Ich benutze Swift 2 und erhalte diesen Fehler nicht - sie sollten wahrscheinlich bei den Optionen pro Code definiert werden, also werden sie möglicherweise anderswo generiert, wenn eine der Eigenschaften null ist? Bitte beachten Sie, dass meine Person-Klasse eine Unterklasse von NSObject ist, die bereits eine Eigenschaft 'description' hat, so dass es sich um einen Konflikt handelt. Ich habe meine Antwort aktualisiert und die Beschreibung in aDescription geändert. Ich bin glücklich, meine Antwort hat geholfen! – Jay