Zas*_*ssX 3 json ios firebase swift firebase-realtime-database
我刚开始使用 NoSQL 结构,所以我有一个关于数据结构的问题。
我们正在开发一个包含群组的应用程序。您可以创建一个组(工作、家庭、密友、自定义)并选择将包含在其中的用户。每个用户都有自己的组。
还可以选择与该人创建聊天 - 用户可以与不同的人创建多个聊天。
我创建了一个 json 结构,所以如果你可以检查它是否是非规范化的,或者我是否可以以某种方式改进它。
{
"groups" : {
"gid1" : {
"name" : "This is first group",
"members" : {
"uid1" : true,
"uid2" : true
}
},
"gid2" : {
"name" : "This is second group",
"members" : {
"uid2" : true,
"uid3" : true
}
}
},
"chats" : {
"cid1" : {
"members" : {
"udi1" : true,
"uid2" : true
},
"messages" : {
"m1" : true,
"m2" : true,
"m3" : true
}
}
},
"messages" : {
"m1" : {
"message" : "Test Message",
"author" : "AuthorName"
},
"m2" : {
"message" : "Test Message 2",
"author" : "AuthorName2"
},
"m3" : {
"message" : "Test Message 3",
"author" : "AuthorName3"
}
},
"users" : {
"uid1" : {
"email" : "first@user.com",
"name" : "FirstUser",
"groups" : {
"gid1" : true
},
"friends" : {
"uid2" : true
},
"chats" : {
"cid1" : true
}
},
"uid2" : {
"email" : "second@user.com",
"name" : "SecondUser",
"groups" : {
"gid1" : true,
"gid2" : true
},
"friends" : {
"uid1" : true
},
"chats" : {
"cid1" : true
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
还有代码问题(iOS,Swift):所以有了这样的结构,我可以调用:/users/uid1/groups。如何获取我创建的所有组?目前我的代码如下所示:
func getGroups(callback:([Group]) -> ()) {
NSLog("Get groups called")
var groupsArray:[Group] = [Group]()
var appendCounter = 0
self.ref?.child("users").child(currentUser!.uid).child("groups").observeSingleEventOfType(.Value, withBlock: { (snapshot: FIRDataSnapshot) in
let tempGroups = snapshot.children
let snapshotCount = snapshot.childrenCount
while let group = tempGroups.nextObject() as? FIRDataSnapshot {
self.ref?.child("groups").child(group.key).observeSingleEventOfType(.Value, withBlock: { (snapshot: FIRDataSnapshot) in
let groupDict = snapshot.value as! [String : AnyObject]
let tempGroup = Group()
tempGroup.key = group.key
tempGroup.name = groupDict["name"] as? String
groupsArray.append(tempGroup)
appendCounter += 1
if appendCounter == Int(snapshotCount) {
callback(groupsArray)
}
})
}
}, withCancelBlock: { (error:NSError?) in
if let error = error {
print(error.description)
} else {
}
})
}
Run Code Online (Sandbox Code Playgroud)
这是正确的方法吗?
小智 5
虽然这完全取决于您将如何获取和显示数据,但我看到的主要问题是,要获取具有当前结构的特定聊天中的所有消息,您将查询chats/cid1/messages然后查询messages每个 m1、m2的数据, 等等。
更好的方法是使用聊天 ID 作为键来构建消息数据,并且您不需要将消息对象保存在对象中chats:
"messages": {
"cid1": {
"m1": {
"message": "Test Message",
"author": "AuthorName",
"timestamp": 1459361875337
},
"m2": { ... },
"m3": { ... }
}
}
Run Code Online (Sandbox Code Playgroud)
当您需要获取聊天中的所有消息时,您只需查询messages/cid1. members如果你愿意,你可以做同样的事情,让chats对象只保存关于对话的元数据,例如聊天室的名称、最后一条消息等。
参考:https : //firebase.google.com/docs/database/ios/structure-data#flatten_data_structures
在 iOS 方面,您可以通过摆脱计数器来简化它,因为 while 循环将在最后一个对象之后自行退出。
while let group = tempGroups.nextObject() as? FIRDataSnapshot {
// create you group object
// append to groupsArray
}
callback(groupArray)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
934 次 |
| 最近记录: |