【问题标题】:Find newest message from each sender?查找来自每个发件人的最新消息?
【发布时间】:2015-10-19 20:49:38
【问题描述】:

我的应用中有一个消息菜单,我完全不知道如何显示从每个用户接收/发送的最新消息,而不加载所有接收/发送的消息。

我使用 Parse 作为我的后端,所以我必须相信有一些聪明的 subqueryNSPredicate 我可以使用它。

我想到的当前解决方案是我的消息的另一个布尔属性,除了最近的消息之外,所有消息都得到了增强,所以我可以知道用一个简单的谓词加载什么。不过,这似乎很草率,请救救我!

编辑:

现在,我正在获取用户是发送者或接收者的消息(取决于分段控件),然后显示发送给/接收的每个用户以及他们最新消息的样本。

目前我正在使用内部逻辑来执行此操作,并且仍在解决过程中(现在逻辑有点倒退......)

let query = PFQuery(className: "Messages")

            if recievedOrSent {
            query.whereKey("other", equalTo: userName)
            print("called OTHER query")
        } else {
            query.whereKey("sender", equalTo: userName)
            print("called SENDER query")
        }

        query.addDescendingOrder("createdAt")
        query.findObjectsInBackgroundWithBlock {
            (objects, error) -> Void in

            if error == nil {

                    if thisSender == userName || self.recievedUsers.contains(thisSender) &&  self.lesserDate(thisTime, rhs: self.recievedUsersTimes[self.recievedUsers.indexOf(thisSender)!])
                    {} else {
                        self.recievedUsers.append(thisSender)
                        self.recievedUsersMsg.append(thisMessage)
                        self.recievedUsersTimes.append(thisTime)
                        self.recievedUsersMsgRead.append(thisRead)
                    }

                    if thisOther == userName || self.sentUsers.contains(thisOther) && self.lesserDate(thisTime, rhs: self.sentUsersTimes[self.sentUsers.indexOf(thisOther)!])
                    {} else {
                        self.sentUsers.append(thisOther)
                        self.sentUsersMsg.append(thisMessage)
                        self.sentUsersTimes.append(thisTime)
                        self.sentUsersMsgRead.append(thisRead)  
                }
    }

【问题讨论】:

  • 你能贴出你迄今为止尝试过的代码吗? Parse 中的日期对象是可比较的,这意味着您可以使用 lessThan、greaterThan 等约束。您可以按降序查询和排序日期(最近的在前),将结果限制为每个用户,然后限制为 50 条消息或任何您想要的。
  • 感谢@Russell!但是我仍然看不到限制和用户名约束如何只从每个用户那里获得第一个。那不就是前 50 个匹配用户并且拥有一个共同用户名的人吗?如果用户刚刚与某人交换了 50 条消息,那将排除其他用户。 -麦克莱恩
  • 对不起,我误解了你的意图。见下文!

标签: ios swift parse-platform nspredicate pfquery


【解决方案1】:

如果您只想从与您进行对话的每个用户那里获取最新消息,请创建一个名为 RecentMessage 的新类,并在每次使用 afterSave 更新它Message 类上的云函数

在 afterSave 挂钩中,在 RecentMessage 类中为每个用户维护指向最新的 Message 的指针。那么你所要做的就是查询当前用户的所有RecentMessage对象并在Message指针上使用includeKey

这让您可以从客户端抽象出更多逻辑,并在性能真正重要的地方简化查询:)

【讨论】:

  • 太棒了,我不习惯云代码,所以我从来没有想过这个。非常感谢,你是救生员!!!
  • 没问题,乐于助人!
猜你喜欢
  • 2020-03-18
  • 1970-01-01
  • 2013-09-24
  • 1970-01-01
  • 2020-07-28
  • 1970-01-01
  • 1970-01-01
  • 2019-04-11
  • 1970-01-01
相关资源
最近更新 更多