2016-07-13 7 views
2

ich eine FIRDataSnapshot zu einem benutzerdefinierten Typ zu konvertieren Ich versuche (dh ich weiß, dass jedes Kind einen Namen haben, Nummer und E-Mail)convert FIRDataSnapshot zu benutzerdefinierten Typ

Wenn ich den Code unten, ein JSON laufen Baum mit jedem Kind, das einen Namen, eine Zahl und eine E-Mail enthält, druckt auf die Konsole.

Also ich möchte den Snapshot als benutzerdefinierten Typ "PersonInfo" mit jeder dieser Eigenschaften speichern. Auf diese Weise kann ich diese Daten in meiner App ändern. Ich muss die Variable "PersonInfo" verwenden, in der ich diese Daten in verschiedenen Teilen meiner App ablege.

ref.observeSingleEventOfType(.Value, withBlock: { (snapshot: FIRDataSnapshot) in 

     print(snapshot) 

    }) 

Antwort

10

Sie können eine benutzerdefinierte Klasse PersonInfo definieren, die als Modell fungiert.

class PersonInfo: NSObject { 
    var pName: String 
    var pNumber :String 
    var pEmail: String 
    let ref: FIRDatabaseReference? 

    init(name: String, number: String, email: String) { 
     self.pName = name 
     self.pNumber = number 
     self.pEmail = email 
     self.ref = nil 
    } 

    init(snapshot: FIRDataSnapshot) { 
     pName = snapshot.value!["pName"] as! String 
     pNumber = snapshot.value!["pNumber"] as! String 
     pEmail = snapshot.value!["pEmail"] as! String 
     ref = snapshot.ref 
    } 

    convenience override init() { 
     self.init(name:"",number: "", email: "") 
    } 
} 

Und in Ihrem observeSingleEventOfType wenn Sie snapshot ist, wird seine Kinder durchlaufen kann und jede Person holen wie:

for item in snapshot.children{ 
    var person = PersonInfo(snapshot:item); 
    yourList.append(person); 
} 

So werden Sie eine Liste von PersonInfo Modellobjekte, die Sie zugreifen können später.

+1

ich diese Antwort so lieben. Als ein Gedanke können Sie in der Lage sein, dass es eine reine Swift-Klasse (Klasse Person {}) ist, anstatt sie an ein NSObject zu binden. Hängt von Ihrem Anwendungsfall ab. – Jay

+2

Ausgezeichnete Antwort - das sollten wir in unseren Dokumenten unbedingt behandeln! –

0

In Objective-C können Sie dies tun:

Header-Datei:

#import <Foundation/Foundation.h> 
#import <FirebaseDatabase/FirebaseDatabase.h> 

@interface RTAObject : NSObject 

@property (nonatomic) NSString pName; 
@property (nonatomic) NSString * pNumber; 
@property (nonatomic) NSString * pEmail; 

-(id) init:(NSString) pName : (NSString*) name :(NSString*) pNumber :(NSString*) pEmail ; 

@end 

Quelldatei:

#import "PersonInfo.h" 

@implementation RTAObject 


-(id)init:(FIRDataSnapshot *)snapshot { 

    _pName = [snapshot valueForKey:@"name"]; 
    _pNumber = [snapshot valueForKey:@"number"]; 
    _pEmail = [snapshot valueForKey:@"email"]; 

    return self; 
} 

-(id) init:(NSString *)pName:(NSString *)pNumber :(NSString *)pEmail 
{ 

    _pName = pName; 
    _pNumber = pNumber; 
    _pEmail = pEmail; 

    return self; 
} 
@end