2015-09-02 3 views
1

Первый раз, работая над Firebase приложения. Я понимаю, что это не позволяет вам сохранить фактический объект Objective C. Я понимаю, что все сохраняется в дереве JSON, которое может быть NSStrings, NSNumbers, NSArrays, NSDictionaries. Вам действительно нужно переходить к каждому свойству, чтобы получить фактическое значение. Ex.Сохранение объектов в Firebase

Скажите, что у вас есть myObject => Firebase не нравится. Вы должны установить значение, получив свойство. Ex. 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, мы просто закодировать объект, когда мы экономим на firebase?

Я немного смущен тем, как его сохранить или даже получить. Parse намного проще, но для этого приложения мне нужна пользовательская firebase.

Любая помощь или примеры того, как вы, ребята, обращались с этим, были бы весьма признательны.

Спасибо!

ответ

3

Это не дает прямого ответа на вопрос, но предоставляет простой вариант.

Подумайте, что узлы firebase имеют имя, а затем набор свойств ключа/значения. Аналогично объекту в ObjC.

Чтобы сделать его очень простым, просто дайте объектам ObjC некоторый интеллект для обработки словаря, считываемого с Firebase, а также обновите дочерние узлы firebase при изменении объекта ObjC.

Например, Прочитайте в одном узле firebase (с дочерними свойствами) в виде FDataSnapshot. (предположим, что мы читаем только один узел, а не их число). Снэпшот имеет свойство .value, которое является словарем пар ключ/значение. Итак, вот как это будет выглядеть в Firebase:

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

Ваш объект User будет объектом с тремя идентичными свойствами; userName, name и currentCity. (важно, чтобы соответствовать именам в этом примере)

Когда вы инициализируете объект 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, а затем заполняет свойства соответствия в пользовательский объект. Это также позволяет объекту User быть очень гибким; так как при добавлении нового дочернего значения (свойства) к узлу в firebase (например, favoriteFood) его можно просто добавить в объект User как свойство с тем же именем.

Если вы не хотите связывать имена вместе, просто некоторые, если ..то в именах Firebase можно использовать для заполнения объекта User.

Аналогичным образом, при обновлении свойства объекта User используйте метод в объекте User, который обновляет дочерний узел в firebase. Подсказка: вы также должны сохранить имя узла Firebase в объекте User, чтобы он знал, какой узел обновить.

Есть 100 других способов иметь эту функциональность, но этот вариант действительно упрощает перемещение данных в Firebase и из него.

+0

Привет, благодарю вас за этот ответ. Итак, по существу, все ваши объекты должны указывать на определенные узлы на Firebase? Я смог войти и заполнить свой объект данными из firebase - это просто не так просто, как синтаксический анализ. – Ronaldoh1

+0

Да! Каждый объект (например, объект User) знал бы об этом узле в Firebase. По мере обновления объекта он автоматически узнает об обновлении соответствующего узла в Firebase. Я бы посоветовал не сравнивать сравнение Parse и Firebase; они - разные платформы, и то, как вы подходите к хранению (и с чем это делается), ваши данные обрабатываются по-разному. – Jay

Смежные вопросы