【发布时间】:2019-10-24 09:18:14
【问题描述】:
Firebase 数据结构
- lastLocations(batteryStatus、lat、long、timestamp、uid)
- 个人资料(姓名、电话号码、图片、uid)
- userFriends (根据 uid -> 有多少朋友 -> conversationUid,friendStatus, notify, phoneNumber, uid)
我的代码:
- 我已经为它创建了tableview 和xib。
- 我已经为最后一个位置、个人资料、用户朋友创建了模型。
- 我已经获取了好友列表,但在 Observe .ChildAdded 上
- 我的用户名
zzV6DQSXUyUkPHgENDbZ9EjXVBj2 - 链接:https://drive.google.com/file/d/19cnkY03MXjrTFgzzPCdvmOuosDRvoMx9/view?usp=sharing
问题:
- 不知道如何通过观察者有效地使用好友列表获取位置和个人资料,因此任何变化都会反映出来。 Firebase 是异步进程。
- 观察者实现,因此数据不会每次都完全加载
要达到的结果:
- 我需要根据我的 uid 在 tableview 上显示好友列表(姓名、头像、电池状态、经纬度(地址)、时间戳)。
Firebase JSON
{
"lastLocations": {
"FTgzbZ9uWBTkiZK9kqLZaAIhEDv1": {
"batteryStatus": 22,
"latitude": 40.9910537,
"longitude": 29.020425,
"timeStamp": 1556568633477,
"uid": "FTgzbZ9uWBTkiZK9kqLZaAIhEDv1"
},
"zzV6DQSXUyUkPHgENDbZ9EjXVBj2": {
"batteryStatus": 88,
"latitude": 41.0173995,
"longitude": 29.1406086,
"timeStamp": 1571778174360,
"uid": "zzV6DQSXUyUkPHgENDbZ9EjXVBj2"
}
},
"profiles": {
"FTgzbZ9uWBTkiZK9kqLZaAIhEDv1": {
"fcmToken": "fp09-Y9ZAkQ:APA91bFgGB1phr4B9gZScnz7ngpqTb5MchgWRFjHmLCVmWGMJVsyFx0rtrz7roxzpE_MmuSaMc4is-XIu7j718qjRVCSHY4PvbNjL1LZ-iytaeDP0oa8aJgE02wET3cXqKviIRMH",
"name": "Skander",
"phoneNumber": "+95644125503",
"uid": "FTgzbZ9uWBTkiZK9kqLZaAIhEDv1"
},
"zzV6DQSXUyUkPHgENDbZ9EjXVBj2": {
"fcmToken": "enMneewiGgg:APA91bHyA4HypWUYhxGTUTTch8ZJ_6UUWhEIXRokmR-Y-MalwnrtV_zMsJ9p-sU_ZT4pVIvkmtJaCo7LFJYJ9ggfhc1f2HLcN9AoIevEBUqyoMN-HDzkweiUxAbyc84XSQPx7RZ1Xv",
"name": "Murad",
"phoneNumber": "+915377588674",
"picture": "profile/zzV6DQSXUyUkPHgENDbZ9EjXVBj2/a995c7f3-720f-45bf-ac58-b2df934e3dff.jpeg",
"uid": "zzV6DQSXUyUkPHgENDbZ9EjXVBj2"
}
},
"userFriends": {
"FTgzbZ9uWBTkiZK9kqLZaAIhEDv1": {
"zzV6DQSXUyUkPHgENDbZ9EjXVBj2": {
"conversationUid": "-L_w2yi8gh49GppDP3r5",
"friendStatus": "STATUS_ACCEPTED",
"notify": true,
"phoneNumber": "+915377588674",
"uid": "zzV6DQSXUyUkPHgENDbZ9EjXVBj2"
}
},
"zzV6DQSXUyUkPHgENDbZ9EjXVBj2": {
"FTgzbZ9uWBTkiZK9kqLZaAIhEDv1": {
"conversationUid": "-L_w2yi8gh49GppDP3r5",
"friendStatus": "STATUS_ACCEPTED",
"notify": true,
"phoneNumber": "+915644125503",
"uid": "FTgzbZ9uWBTkiZK9kqLZaAIhEDv1"
}
}
}
}
快速函数:
func getFrndDataList(){
AppData.removeAll()
ref.child("userFriends").child("zzV6DQSXUyUkPHgENDbZ9EjXVBj2").observe(.childAdded, with: { (snapshot) in
guard let data = try? JSONSerialization.data(withJSONObject: snapshot.value as Any) else { return }
let frndList = try? JSONDecoder().decode(Friend.self, from: data)
self.AppData.append(frndList!)
self.tableView.reloadData()
print([frndList])
})
}
【问题讨论】:
-
有大约 10 种不同的方法来解决这个问题,我会发布一个答案。一个问题:为什么每个用户的数据都存储在不同的节点中?您将用户位置数据存储在 /lastLocations 节点中,然后将姓名和电话号码存储在 /profiles 节点中,然后将朋友状态存储在 中/userFriends 节点。似乎所有这些数据都可以存储在
/users/uid/this_users_info节点中。更改结构将使其更易于维护,需要更少的代码和更少的 Firebase 访问(降低成本)。 -
@Jay 我没有亲自设计过这个数据库结构。即使我已经讨论并强调了这个问题,以更改数据库结构
lastlocations & profile nodes必须存储在userFriend中,正如您已经提到的但我以这种方式得到的答案我们只针对特定节点以防更改/删除。跨度> -
嗯。在任何情况下,您都只针对特定节点进行更改/删除。换句话说,如果用户的电池状态发生变化,您将需要在他们的 /lastLocations/uid 节点中更新电池状态。如果它们都在一起,则必须在 /users/uid 节点 中更新电池状态。无论它在哪里都必须更新,所以没有真正的区别。
-
发表了最长的答案evah,希望对您有所帮助。哈哈。如果您需要澄清,请告诉我。
标签: ios swift firebase uitableview firebase-realtime-database