【发布时间】:2016-06-15 08:31:28
【问题描述】:
我正在使用 Parse 在基于 Swift 的 iOS 应用程序中开发一个简单的聊天系统。到目前为止,我在 Parse 中定义了两个类:User(定义用户)和 Message(定义发送给用户的单个消息)。这是我的 Message 类字段:
UserFromID (pointer): points to the User object that sent the message
UserToID (pointer): points to the User object that receives the message
createdAt (DateTime): creation point in time (built-in field)
Content (string): the textual message to show the user
在对话选择屏幕上,我想显示一个表格,列出登录用户与之交互的每个用户。我还想获取该对话中记录的最后一条消息,而不管该对话中的两个用户之间是谁发送的。我已经能够做到这一点,但是以一种浪费的方式:
// get all messages sent FROM and TO the user
let primaryObj = PFObject(withoutDataWithClassName: "_User", objectId: self.userID)
let fromQuery = PFQuery(className: "Message")
let toQuery = PFQuery(className: "Message")
// add constraints to both queries
fromQuery.whereKey("UserFromID", equalTo: primaryObj)
toQuery.whereKey("UserToID", equalTo: primaryObj)
// generate the concatenated query, include User access, and return sorted
let masterQuery = PFQuery.orQueryWithSubqueries([fromQuery, toQuery])
masterQuery.includeKey("UserFromID")
masterQuery.includeKey("UserToID")
masterQuery.orderByDescending("createdAt")
// execute the query, and perform response logic
masterQuery.findObjectsInBackgroundWithBlock({
(results: [PFObject]?, error: NSError?) -> Void in
// query logic goes here...
})
这可行,但同样,它会返回所有用户之间发送给和来自登录用户的所有消息。我只想要每个用户之间的最新消息。当前的解决方案会产生大量开销,我认为 Parse 对对象请求的硬限制是 1000。两个用户很容易在一个月甚至一周内相互发送 1000 条消息,具体取决于用户。我的解决方案需要每台设备进行许多大型查询,忽略缓存计划,而我的请求将仅来自聊天。尤其是当数据要求如此之低时。
我希望我的 fromQuery 和 toQuery 做的是在每个唯一的 otherUser 基础上获取具有最大 createdAt 字段 (DateTime) 的消息。
【问题讨论】:
标签: ios database swift parsing parse-platform