【问题标题】:convert FIRDataSnapshot to custom type将 FIRDataSnapshot 转换为自定义类型
【发布时间】:2016-11-16 11:56:39
【问题描述】:

我正在尝试将 FIRDataSnapshot 转换为自定义类型(即我知道每个孩子 将有姓名、号码和电子邮件)

当我运行下面的代码时,控制台会打印一个 JSON 树,其中每个子节点都包含名称、号码和电子邮件。

所以我想将快照存储为具有这些属性的自定义类型“PersonInfo”。这样我就可以在我的应用程序中更改这些数据。我需要使用“PersonInfo”变量将此数据存储到我的应用程序的各个部分。

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

        print(snapshot)

    })

【问题讨论】:

    标签: swift firebase closures firebase-realtime-database


    【解决方案1】:

    您可以定义一个自定义类 PersonInfo 作为模型。

    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: "")
        }
    }
    

    在你的observeSingleEventOfType 中,当你有snapshot 时,你可以遍历它的子元素并获取每个人:

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

    因此,您将获得一个 PersonInfo 模型对象列表,供您以后访问。

    【讨论】:

    • 我非常喜欢这个答案。作为一个想法,你可以让它成为一个纯 Swift 类(类 Person {}),而不是将它绑定到一个 NSObject。取决于您的用例。
    • 很好的答案——我们绝对应该在我们的文档中介绍这一点!
    • 这似乎不再起作用。快照现在是 DataSnapshot(不是 FIRDataSnapshot),当您尝试 snapshot.value!["pName"] as!字符串,您将收到一条错误消息,指出“Any 类型没有下标成员”。这篇文章写于大约 3 年前,但 firebase 文档从未包含和更新它。太糟糕了。
    • 我会尽快更新。我要让那台旧钻机再次运行
    【解决方案2】:

    在目标 c 中你可以这样做:

    头文件:

    #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
    

    源文件:

    #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
    

    【讨论】:

      猜你喜欢
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-30
      相关资源
      最近更新 更多