2015-09-02 179 views
1

第一次使用Firebase應用程序。我明白,它不允許你保存實際的Objective C對象。我明白,一切都保存在一個JSON樹,可以是NSStrings,NSNumbers,NSArrays,NSDictionaries。您實際上必須深入到每個屬性才能獲得實際值。防爆。將對象保存到Firebase

假設你有myObject => Firebase不喜歡它。您必須通過獲取屬性來設置值。防爆。 myObject.name(這將是一個字符串)。如果你的對象有很多屬性,這是非常煩人的。

我知道你可以實現NSCoding使它更優雅。我從來沒有這樣做過。我有一個用戶的以下對象。

#import <Foundation/Foundation.h> 

@interface User : NSObject <NSCoding> 


@property (nonatomic, copy) NSString *username; 
@property (nonatomic, copy) NSString *name; 
@property (nonatomic, copy) NSString *currentCity; 

@end 

#import "User.h" 

@implementation User 
    @dynamic username; 
    @dynamic name; 
    @dynamic currentCity; 

-(void)encodeWithCoder:(NSCoder *)encoder{ 

    [encoder encodeObject:self.username forKey:@"username"]; 
    [encoder encodeObject:self.name forKey:@"name"]; 
    [encoder encodeObject:self.currentCity forKey:@"currentCity"]; 


} 

-(id)initWithCoder:(NSCoder *)decoder{ 

    if (self = [super init]) { 
     self.username = [decoder decodeObjectForKey:@"username"]; 
     self.name = [decoder decodeObjectForKey:@"name"]; 
     self.currentCity = [decoder decodeObjectForKey:@"currentCity"]; 

    } 

    return self; 
} 

所以保存到存儲在火力地堡用戶對象的時候,我們剛剛編碼,當我們保存到火力的對象?

我對如何保存甚至檢索它有點困惑。解析是非常直接的,但對於這個應用程序,我需要用戶firebase。

任何幫助或您如何處理這個問題的例子將不勝感激。

謝謝你!

回答

3

這並不直接回答問題,但提供了一個簡單的選項。

想象firebase節點有一個名稱,然後是一組鍵/值屬性。類似於ObjC中的對象。

爲了讓它變得非常容易,只需給你的ObjC對象一些智能來處理從Firebase讀入的字典,並且同樣在ObjC對象改變時更新firebase子節點。

例如;作爲FDataSnapshot讀入一個firebase節點(帶有兒童屬性)。 (假設我們只讀取一個節點而不是數量)。快照有一個.value屬性,它是一個鍵/值對的字典。所以下面是它在Firebase中的外觀:

user_id_0 
    userName: "dude" 
    name: "Joe Smith" 
    currentCity: "Miami" 

您的用戶對象將是具有三個相同屬性的對象;用戶名,名稱和當前城市。 (在本例中與名稱匹配很重要)

初始化User對象時,只需將它傳遞給FDataSnapshot(ss)中的字典,它就會從這些鍵中填充它自己。這樣

NSDictionary *dict = ss.value; 

    User *aUser = [User new]; 
    [aUser initWithDict:dict]; 

並且在用戶對象的initWithDict方法東西

for (id key in dict) { 
    id value = dict[key]; 
    [self setValue:value forKey:key]; 
} 

上面通過每個鍵/值對走在從火力地堡的字典,然後填充在匹配屬性用戶對象。這也允許用戶對象非常靈活;因爲當您將新的子值(屬性)添加到firebase中的節點(如favoriteFood)時,它可以簡單地作爲具有相同名稱的屬性添加到User對象。

如果你不想把名字綁在一起,只是一些if ..那麼可以使用Firebase名稱來填充用戶對象。

同樣,在更新User對象的屬性時,請使用User對象內的方法來更新Firebase中的子節點。提示:您還應該將Firebase節點名稱存儲在User對象中,以便知道要更新哪個節點。

有100種其他方式具有此功能,但此選項真正簡化了將數據移入和移出Firebase的過程。

+0

嗨Jay謝謝你的迴應。那麼基本上所有對象都應該指向Firebase上的特定節點?我能夠使用來自Firebase的數據登錄並填充我的對象 - 它不像分析那樣直觀。 – Ronaldoh1

+0

是的!每個對象(例如一個用戶對象)都會知道它是Firebase中的節點。隨着對象更新,它會自動知道更新它在Firebase中的相​​應節點。我建議不要直接比較Parse和Firebase;它們是不同的平臺,並且您處理存儲的方式(以及完成的方式)您的數據處理方式不同。 – Jay