Ios 在Swift中使用Firebase统计未看到的邮件

Ios 在Swift中使用Firebase统计未看到的邮件,ios,swift,firebase,swift3,firebase-realtime-database,Ios,Swift,Firebase,Swift3,Firebase Realtime Database,我正在尝试编写一个聊天应用程序 我想计算未查看(未查看)的邮件数 我的数据库如下所示: user-messages | |_messages | |_UserID1 | | | |_UserID2 | | | |_ MessageID1 | |_ MessageID2 | |_ MessageID3 | |_ etc... | |_UserID2

我正在尝试编写一个聊天应用程序

我想计算未查看(未查看)的邮件数

我的数据库如下所示:

user-messages
 |
 |_messages
    |
    |_UserID1
    |   |
    |   |_UserID2
    |     |
    |     |_ MessageID1
    |     |_ MessageID2
    |     |_ MessageID3
    |     |_ etc...
    |     
    |_UserID2
    |   |
    |   |_UserID1
    |     |
    |     |_ MessageID1
    |     |_ MessageID2
    |     |_ MessageID3
    |     |_ etc...
对于Messages对象:

messages
 |
 |_messageID1
 |  |
 |  |_ notViewed: false / true
 |  |_ text: "Message text"
 |  |_ timestamp: 1522230692
 |  |_ etc...
 |  
 |_messageID2
 |  |
 |  |_ notViewed: false / true
 |  |_ text: "Message text"
 |  |_ timestamp: 1522230692
 |  |_ etc...
我到达目的地是为了获取链接到特定用户的所有消息ID:

var REF_MESSAGE = Database.database().reference().child("messages")
var REF_USER_MESSAGE = Database.database().reference().child("user-messages").child("messages")


func fetchUnviewedMessages(withId id: String, completion: @escaping (Int) -> Void ) {

      REF_USER_MESSAGE.child(id).observe(.childAdded) { (snapshot) in

         let userId = snapshot.key as String

         self.REF_USER_MESSAGE.child(id).child(userId).observe(.childAdded, with: { (snapshot) in
            let messageId = snapshot.key

                // This part is where I have a problem
                self.fetchMessageNotViewed(messageId, completion: { (nbMessageNotRead)  in
                   completion(nbMessageNotRead)
                })
             })
          }
    }
但是我不知道我需要用这个列表做什么,来观察看不见的信息的数量

我试过了,但没有成功:

func fetchMessageNotViewed(_ messageId: String, completion: @escaping (Int) -> Void) {
      guard let currentUid = Api.User.CURRENT_USER?.uid else {
         return
      }

      REF_MESSAGE.child(messageId).queryOrdered(byChild: "notViewed").queryEqual(toValue: true).observe(.value, with: { (snapshot) in

         let count = Int(snapshot.childrenCount)
         print(count)
      }, withCancel: nil)
}

应@KevinB的要求

您可以使用我的逻辑在消息弹出窗口中显示计数器

步骤:-1Web服务调用/Firebase获取:

在app中获取消息数据数组。在我的例子中,我有一个消息数组作为响应,并将其计数存储为userDefault。 例如:-

UserDefaults.standard.set(arrMessageData.count, forKey: "messageCount")
步骤:-2读取消息或用新值附加旧值时,将计数器设置为零

案例:1阅读信息

在我的例子中,我有一个单独的弹出窗口来阅读消息。当弹出窗口打开时,我强制将我的userDefault值设置为0

UserDefaults.standard.set(0, forKey: "messageCount")
案例:如果消息未读取,则为1

在这种情况下,如果弹出窗口没有打开,那么在这种情况下,userDefault中会有一些值。在本例中,首先在userDefault中获取当前计数,然后进行WSCall并获取新计数,然后将两者相加,然后保存在同一个键中


注意:-之所以使用userDefault存储计数器,是因为它可以在应用程序中的任何位置访问,并且可以直接显示在任何标签或按钮中。

我们可以利用复合值轻松处理此问题

对Firebase结构消息节点进行简单更改:

messages
 |
 |_messageID1
 |  |
 |  |_ notViewed: false / true
 |  |_ text: "Message text"
 |  |_ timestamp: 1522230692
 |  |_ forUid_status: "UserId1_unread"   //<- Compound value
 |  |_ etc...
 |  
 |_messageID2
 |  |
 |  |_ notViewed: false / true
 |  |_ text: "Message text"
 |  |_ timestamp: 1522230692
 |  |_ forUid_status: "UserId1_read"   //<- Compound value
 |  |_ etc...
针对上述Firebase运行此代码会导致

unread messages: 1

这也可能有助于加载未读消息,因为您不仅可以获取未读消息的数量,而且在为UserId1添加新的未读消息时,将观察员添加到该节点也会通知应用程序。您想要每个用户或所有用户的未读消息吗?我想要为特定用户计算未读消息的数量,为了让他知道他有新消息(或没有)在选项卡中有一个点什么是
REF\u USER\u MESSAGE
??告诉我整个节点。也许这会有帮助。你可以用一个计数器来做这个。例如,我使用了一个场景,在这个场景中,我使用了一个UserDefault键,在这个键中我存储了数组的计数,在这个数组中我得到了消息的响应。每次用户读取消息时,我都会将其计数返回到0。如果用户没有读取任何消息,则需要将当前响应添加到UserDefault变量的现有值。如果你愿意,我可以为你制作一个示例代码。我认为第二步行不通。我可以有不止一次的讨论,因此,我可以阅读讨论,但仍然有未看到的消息,您可以使用and数组,也可以支持本地数据库。就像您可以管理一个键值对,然后可以在DB或字典数组中管理计数器讨论。在这种情况下,您可以使用相同的逻辑将计数器更新为零或附加旧值,当我们将“未读”状态更改为“已读”状态时,我们需要做什么?。我们需要将每个用户状态(forUid_status)的消息更新为'read'@razesh如果目标是跟踪已读和未读的消息,那么每个消息都需要更新其状态,因为它们从未读变为已读,所以是的。只是一个简单的更改,即每个消息中的一个节点都可以正常工作。
unread messages: 1