Nit*_*ija 8 chat ios firebase swift firebase-realtime-database
我正在firebase的帮助下设计一个聊天应用程序,但我对数据库设计感到震惊.我已经阅读了app的 firebase 结构数据提供的以下链接
我目前的做法:
"messages" : {
"-Kkiyu4zSKQAzu3MxpGe": {
"recId" : 1994,
"senderId" : 9,
"senderName" : "Alex",
"text" : "Hello",
"time" : "2017-05-22T12:37:41+0530"
},
"-Kkiyw1yVTbR_wDFFiuA" : {
"recId" : 9,
"senderId" : 1994,
"senderName" : "Ted",
"text" : "Hi",
"time" : "2017-05-22T12:37:49+0530"
},
"-KkiywFENy__tCHuuuom" : {
"recId" : 1994,
"senderId" : 9,
"senderName" : "Alex",
"text" : "What's up?",
"time" : "2017-05-22T12:37:50+0530"
},
"-KkiyxDjsUIXBlM0Cn3R" : {
"recId" : 9,
"senderId" : 1994,
"senderName" : "Ted",
"text" : "All good",
"time" : "2017-05-22T12:37:54+0530"
}
Run Code Online (Sandbox Code Playgroud)
类似地,我有用户JSON结构,在该结构中,我有3种类型的用户,如下所示
1. Branch Manager
2. Delivery boy
3. Admin
"users" : {
"9" : {
"empId" : 9,
"isOnline" : false,
"name" : "Alex",
"userType" : "M"
},
"1994" : {
"branchId" : 9,
"empId" : 1994,
"isOnline" : false,
"name" : "Ted",
"userType" : "D"
},
"25" : {
"empId" : 25,
"isOnline" : false,
"name" : "Tim",
"userType" : "A"
}
}
Run Code Online (Sandbox Code Playgroud)
我的应用程序中的听众如下:
sendReference.observe(.childAdded, with: { (snapshot) in
if let data = snapshot.value {
let message = RCMessage(object: data)
message.Id = snapshot.key
let dbManager = RCPersistencyManager()
dbManager.add(message: message)
}
})
receiveReference.observe(.childAdded, with: { (snapshot) in
if let data = snapshot.value {
let message = RCMessage(object: data)
message.Id = snapshot.key
let dbManager = RCPersistencyManager()
dbManager.add(message: message)
dbManager.update(userwithMessage: message)
}
})
Run Code Online (Sandbox Code Playgroud)
我在我的senderId和我的recieverId上添加了列表,我认为这是切肉刀,因为我将收到只有发送或指向我的信息.
sendReference = companyReference.child("messages").queryOrdered(byChild: "senderId").queryEqual(toValue: Int(RCDataManager.get(stringforKey: "RCUserID")!))
receiveReference = companyReference.child("messages").queryOrdered(byChild: "recId").queryEqual(toValue: Int(RCDataManager.get(stringforKey: "RCUserID")!))
Run Code Online (Sandbox Code Playgroud)
但是现在更大的问题到了我在应用程序处于前台时附加这些监听器现在我收到的数据是在以下查询下创建的每个子项我确实为应用程序维护了一个本地数据库但我不想让所有的孩子一次又一次,当孩子的数量超过200或说300,同步数据库需要时间,这会降低我的应用程序的性能我想只获得查询下的新消息,我知道这个设计不好得到真的很期待好的答案.
提前致谢
我收到的数据是在以下查询下创建的每个子项我确实为应用程序维护一个本地数据库,但我不想一次又一次地获取所有子项,因为当子项数量超过 200 或说 300 时需要时间来同步数据库,这会降低我的应用程序的性能我只想获取查询下的新消息
你的问题有很多东西需要解开,但这只是表明你注重细节。试图解决这个问题,看来您真的只是想将查询结果限制为最新的。
为此,请考虑过滤您的数据
如果我是你,我会在几乎伪代码中执行以下操作:
1) Initial population of local cache of messages.
2) On subsequent opens, query your local cache for the
newest message and check the `time` at which it was created
3) In your queries to Firebase, add the queryStartingAtValue and pass it your last synced time and you'll only receive new messages.
Run Code Online (Sandbox Code Playgroud)
在不知道你的用户界面是什么样子的情况下,很难说限制你下载的消息数量的可行性,因为你需要某种“加载更多”指示器来无缝地做到这一点。该方法与初始负载相同。