ios - 过滤唯一值以在消息收件箱中显示唯一用户名

标签 ios swift firebase google-cloud-firestore

我想过滤receiverID,以便只获得唯一的receiverID。下面是我的代码:

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell{
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellIdentifier, for: indexPath) as! InboxCollectionViewCell
    cell.inboxMessage.text = chats[indexPath.row].receiverID
    return cell
}



    func loadPosts() {
    let senderIDNumber = Auth.auth().currentUser?.uid
    let chatsRef = db.collection("chats")
    chatsRef.whereField("senderID", isEqualTo: senderIDNumber!)
        .addSnapshotListener { querySnapshot, error in
            guard let documents = querySnapshot?.documents else {
                print("Error fetching documents: \(error!)")
                return
            }
            for document in documents {
                let messageText = document.data()["message"] as? String
                let senderIDNumber = document.data()["senderID"] as? String
                let receiverIDNumber = document.data()["receiverID"] as? String
                let timestamp = document.data()["timestamp"] as? String
                let conversationsCounter = document.data()["conversationsCounter"] as? Int
                let chat = Chat(messageTextString: messageText!, senderIDNumber: senderIDNumber!, receiverIDNumber: receiverIDNumber!, timeStampString: timestamp!, conversationsCounterInt: conversationsCounter!)
                self.chats.append(chat)
                print(self.chats)
                self.collectionView.reloadData()
            }
    }
}

知道如何进行过滤以便我的 inboxMessage 显示唯一用户吗?我使用 Firebase/Firestore 作为我的数据库。

最佳答案

听起来您正在尝试按收件人对结果进行分组。 Firestore的查询API中没有这样的group by子句。您必须自己循环所有消息,并将它们分组到客户端。

chatsRef.whereField("senderID", isEqualTo: senderIDNumber!)
    .order(by: "receiverID")
    .addSnapshotListener { querySnapshot, error in
        ...
        let lastReceiverID = "";
        for document in documents {
            ...
            let receiverIDNumber = document.data()["receiverID"] as? String

            if receiverIDNumber != lastReceiverId {
              // TODO: do something with receiverIDNumber
            }
            lastReceiverId = receiverIDNumber
        }

事实上,您的数据模型目前看起来就像所有用户之间都有一个长长的聊天消息列表,这感觉像是从聊天的关系数据模型非常直接的转换。

在 NoSQL 数据库中,您通常希望对数据进行建模,使其更接近应用程序实际需要的方式。例如,您似乎正在尝试显示给定发件人的所有消息。在这种情况下,请考虑将这些消息存储在单独的集合中。例如。如果您已经有顶级 /users 集合,则可以将他们发送的消息放在下面的 sent 子集合中:/users/$uid/sent .

有关数据建模注意事项的更多信息,请参阅 NoSQL data modeling以及 Todd 关于 Cloud Firestore 的视频系列( episode 1episode 2 )。

关于ios - 过滤唯一值以在消息收件箱中显示唯一用户名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50862899/

相关文章:

ios - Swift 4 JSON 解码器

ios - 计算运动时间CMMotionActivity?

iphone - 相机应用程序支持方向吗?

javascript - 在 firebase web 中读取 child 的 child (javascript)

ios - 多个设备之间的通信

swift - Firebase 自定义 reCaptach AuthUIDelegate - Swift

ios - 裁剪图像的问题

Swift:快速创建日期数组

ios - 当我在我的应用程序中按下一个按钮时,整个应用程序卡住

swift - layerWithSession 在 swift 2.0 中不可用?