簡體   English   中英

單擊 iOS 中的按鈕時,如何調整 Firebase SnapshotListener 限制?

[英]How can I adjust my Firebase SnapshotListener limit when I click on a button in iOS?

對於我的聊天,我在一個類中有一個函數,我在“消息”集合上創建了一個 SnapshotListener。 出於性能考慮,我將返回的文檔數量限制為 20。我想做的是更改此限制並為每次單擊按鈕添加 20 個更多文檔,並使 SnapshotListener 現在調整為這 40 個文檔。 我怎樣才能做到這一點? 當它不在 SnapshotListener 中時很容易,但我該如何使用它呢?

    func readAllMessages() {
        let docRef = ref.collection("discussions").document(id)
        
        docRef.collection("messages")
            .order(by: "dateCreated", descending: true)
            .limit(to: 20)
            .addSnapshotListener { (snap, err) in
            guard let documents = snap?.documents.reversed() else {
                print(err!.localizedDescription)
                return
            }

            self.messages = documents.compactMap { (QueryDocumentSnapshot) -> Message_M? in
                return try? QueryDocumentSnapshot.data(as: Message_M.self)
            }
            
        }

    }

Firestore 中的查詢是不可變的,因此無法更改已附加偵聽器的查詢。 您必須使用新的limit(to: 40)創建一個新查詢,然后為其附加一個新的偵聽器。

如果您啟用了磁盤持久性(默認情況下),前 20 個文檔將來自本地緩存,因此您應該只為 20 個新文檔收取文檔讀取費用。

我幾乎解決了我的問題。 使用此代碼它可以工作,但是一旦我寫了一條新消息(文檔),請求返回的數量就會回到它的來源(對於我的測試,limitToRead = 2)。 因此,如果我只單擊按鈕,它就可以工作(我在聊天中收到了 2、4、6、8 等消息,順序正確)但是一旦我向其他用戶發送消息或收到消息(a消息集合上的新寫入)它返回到 2 條消息。

我修改后的功能:

   func readAllMessages(limitToRead: Int) {
        let docRef = ref.collection("discussions").document(id)
        
        docRef.collection("messages")
            .order(by: "dateCreated", descending: true)
            .limit(to: limitToRead)
            .addSnapshotListener { (snap, err) in
                guard let documents = snap?.documents.reversed() else {
                    print(err!.localizedDescription)
                    return
                }
                
                self.messages = documents.compactMap { (QueryDocumentSnapshot) -> Message_M? in
                    return try? QueryDocumentSnapshot.data(as: Message_M.self)
                }
                
            }
    }

我的看法 :

...

@State private var limitToRead: Int = 2

init(...) {
    ...
    messageData.readAllMessages(limitToRead: 2)
    ...
}
...
Button {
    limitToRead += 2
    messageData.readAllMessages(limitToRead: limitToRead)
} label: {
    Text("Tap me!")
        .padding()
        .foregroundColor(.white)
        .background(.red)
}

...

正如弗蘭克所建議的,我如何在這個函數中創建一個新的查詢和新的偵聽器並將我的消息數組附加到它?

更新 :

我也試過這個=相同的結果:

    func readAllMessages(limitToRead: Int, newListener: Bool) {
        let docRef = ref.collection("discussions").document(id)
        
        var listener = docRef.collection("messages")
            .order(by: "dateCreated", descending: true)
            .limit(to: limitToRead)
            .addSnapshotListener { (snap, err) in
                guard let documents = snap?.documents.reversed() else {
                    print(err!.localizedDescription)
                    return
                }
                
                self.messages = documents.compactMap { (QueryDocumentSnapshot) -> Message_M? in
                    return try? QueryDocumentSnapshot.data(as: Message_M.self)
                }
                
            }
        
        if newListener == true {
            listener.remove()
            
            listener = docRef.collection("messages")
                .order(by: "dateCreated", descending: true)
                .limit(to: limitToRead)
                .addSnapshotListener { (snap, err) in
                    guard let documents = snap?.documents.reversed() else {
                        print(err!.localizedDescription)
                        return
                    }
                    
                    self.messages = documents.compactMap { (QueryDocumentSnapshot) -> Message_M? in
                        return try? QueryDocumentSnapshot.data(as: Message_M.self)
                    }
                    
                }
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM