在 Swift 中为 Firebase 数据结构创建类

Posted

技术标签:

【中文标题】在 Swift 中为 Firebase 数据结构创建类【英文标题】:Creating class for Firebase DataStructure in Swift 【发布时间】:2017-02-15 22:52:17 【问题描述】:

我是 firebase 新手,创建了一个 Firebase 结构供我使用,我要做的基本上是列出 FirebaseDB 的所有用户。

我想在下面的firebase数据结构中快速创建一个对应的类。

 "users" : 
    "A654tdC5uBPoKQzJnpZIpwOfsaJ3" : 
      "groups" : 
        "-KZ7fl3I4W7YWuGk6l9k" : true,
        "-KclzmvvJF54cAg14P92" : true,
        "-KclzpzrJOhCOWL5_jvw" : true,
        "-Kcm33N1B_oiVYrQWh3n" : true,
        "-Kcm3GfRaaGfztEBmflp" : true
      ,
      "location" : 
        "coordinates" : [ 6.59086, 3.3914267 ],
        "name" : "Oyebanjo Solarin Street, Lagos",
        "visibility" : true
      ,
      "photoUrl" : "http://pbs.twimg.com/profile_images/511567946351923201/YBqqKc78_normal.jpeg",
      "username" : "Kamiye",
      "visibilityToSelectContacts" : 
        "contacts" : 
          "gFTCpzgSJDOsrVKWbAJp0Z1JFXp1" : true,
          "rRxT6x87kgSjTwZfa7M8ZwzdFkC3" : true
        ,
        "visibility" : true
      
    ,

这是我尝试过的,但它不起作用

class LContact 

var visibliityToSelectedContacts: VisibilityToSelectContacts?
var photoUrl: String?
let username: String
var location: LALocation?
var groudId = [String]()


init (value: [String: Any] ) 
    self.username = value["username"] as! String
    self.photoUrl = value["photoUrl"] as? String
    self.location = LALocation(value: value["coordinates"] as? [String:Any] ?? [:])
    self.groudId = (value["groups"] as? [String])!
  


class VisibilityToSelectContacts 

var contacts = [String]()
var visibility: Bool

init(value: [String: Any]) 
    self.contacts = [value["contacts"] as! String]
    self.visibility = value["visibility"] as! Bool
  


struct LALocation 

var long: Double
var lat: Double
var address: String!
var visibility: Bool!

init(long: Double, lat: Double, address: String?, visibility: Bool) 
    self.long = long
    self.lat = lat
    self.address = address
    self.visibility = visibility


init?(value: [String: Any]) 
    guard let long = value["0"] as? Double,
        let lat = value["1"] as? Double else return nil
    self.long = long
    self.lat = lat
    self.address = value["name"] as? String
    self.visibility = value["visibility"] as? Bool
   

【问题讨论】:

你能澄清你的问题吗?您想为您的数据库结构创建一个类模型——搜索注册用户?搜索哪里,一个数组?代码?在火力基地? 它不工作 是什么意思?你有错误吗?提供的代码似乎过于复杂,所以也许您可以简化它 - 提供更多详细信息(和更短的代码)将有助于我们为您提供帮助。还有,*A654tdC5uBPoKQzJnpZIpwOfsaJ3*代表什么? @Jay 我已经发布了我的 firebase 结构的 sn-p,我要做的就是为上面的 sn-p 创建一个类 格式到处都是,真的很难阅读。我改变了我的评论。 @Jay 我已经编辑了这个问题,请你帮我上一个结构类。 【参考方案1】:

让我带您了解一些可能有帮助的代码。这不是整个班级,而是所有的概念都在那里。我也在使用简化的 Firebase 结构,但同样,概念是相同的:

这是 Firebase 结构

users
  a_uid
    email: "some email"
    groups
      group_1: true
      group_2: true
    location
      coords: "[52.5, 67.1]"
      name: "Oyebanjo Solarin Street, Lagos"
      visibility: true
    username: "some username"

首先,似乎每个用户都有一个位置,这使它成为一个结构。

   struct LocationStruct 
        var coords: String?
        var name: String?
        var visibility: Bool?
    

然后我们在用户类中使用该结构。在此示例中,我们为单个用户传入一个快照以初始化类并解构它以填充类变量。

class UserClass 
    var email = ""
    var username = ""
    var groupsDict: [String: Any]
    var loc = LocationStruct()

    init(snap: FIRDataSnapshot) 

        let userDict = snap.value as! [String: Any]

        self.email = userDict["email"] as! String
        self.username = userDict["username"] as! String

        self.groupsDict = userDict["groups"] as! [String: Any]

        let locationDict = userDict["location"] as! [String: Any]
        self.loc.coords = locationDict["coords"] as? String
        self.loc.name = locationDict["name"] as? String
        self.loc.visibility = locationDict["visibility"] as? Bool
    

这是读取单个用户并填充 UserClass 的代码

    ref.child("users").child("a_uid")
                      .observeSingleEvent(of: .value, with:  snapshot in

        let user = UserClass(snap: snapshot)

        //this code is just to show the UserClass was populated.
        print(user.email)
        print(user.username)

        for group in user.groupsDict  //iterate over groups
            print(group)  //and print each one
        

        print(user.loc.coords!) //print the location data
        print(user.loc.name!)
        print(user.loc.visibility!)
    )

您的结构中唯一剩下的问题是visibilityToSelectContacts 节点,该节点有一个子节点contacts。

因此,基本上 UserClass 中 userDict 的高级字典将有一个名为 visibilityToSelectContacts 的子级,然后有一个子级联系人,该子级联系人有一个键值对的子字典:“gFTCpzgSJDOsrVKWbAJp0Z1JFXp1”:true。像这样

userDict
   visibilityToSelectContacts
      contacts
        contant_0: true
        contant_1: true

我会让你把这个结构敲出来(提示:这是相同的设计模式)

【讨论】:

【参考方案2】:

尝试使用 3d 派对库进行拆箱,例如 this。 还要检查您用来提取未来孩子的密钥,例如:

LALocation(value: value["coordinates"] as? [String:Any] ?? [:])

这里你需要:

LALocation(value: value["location"] as? [String:Any] ?? [:])

获取数据后不要忘记提取对象 id snapshot.key

【讨论】:

这与创建类以匹配 Firebase 结构的问题有什么关系?为什么要在数据已经可用的情况下添加第三方库? 我需要创建一个类,我不知道是否需要添加第三方。如果您可以编辑我尝试过的内容,我将不胜感激。我还是 Firebase 的新手。

以上是关于在 Swift 中为 Firebase 数据结构创建类的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中为以下观察删除 GeoFire 句柄?

如何在 Swift 中为以下观察删除 GeoFire 句柄?

如何在swift ui中使用autoid将带有字段的新文档添加到firebase集合

在swift中仅使用来自firebase的值返回一个键

如何在单个 Firebase 数据库中为多个应用构建推送令牌

如何在firebase-flutter中为快照数据指定字段[重复]