首页 > 解决方案 > 内存泄漏与 swiftUI 列表和 Firebase 数据库观察 childAdded

问题描述

我正在使用 firebase 编写聊天应用程序,在观察发送或接收消息时的数据库更改时,我注意到 ChatView 中的内存泄漏。

当我注释掉数据库观察时,内存泄漏不再发生,所以我猜这是一个火力问题。

我正在共享代码,所以如果您知道是什么严重导致内存泄漏,请帮助我。

聊天视图模型:

class ChatViewModel : ObservableObject  {

/// - sub ViewModels :
@Published private(set) var messages : [MessageModel] = []
private(set) var conversationID : String? = nil

/// set shared conversationID
/// - Parameter convesationID: shared conversationID if exist
func setConverationID(convesationID : String?){
    guard let convesationID = convesationID else {
        print("CONVERSATION ID DOUS NOT EXIT")
        return
    }
    self.conversationID = convesationID
    startObservingConversation()
}
/// start observing the conversation with viewModel conversationID
private func startObservingConversation(){
    guard let conversationID = self.conversationID else {
        return
    }
    DatabaseManager.shared.observeMessagesForConversation(conversationId: conversationID) { [weak self] message in
        self?.messages += message
    }
}}

聊天视图:

struct ChatView: View {

@StateObject var viewModel = ChatViewModel()

var body: some View {
    VStack(alignment :  .leading , spacing: 0){
        
        ScrollViewReader { scrollViewReader in
            List{
                ForEach(viewModel.messages) { item in
                    MessageView(messsage: item.text)
                        .id(item.id)
                }
            }
        }
    }
}}

观察者消息:

func observeMessagesForConversation(conversationId id :String,compelition : @escaping ([MessageModel]) -> Void ) {
    database.child(id).child("messages").observe(.childAdded) { snapshot in
        guard let value = snapshot.value as? [String:Any] else {
            compelition([])
            return
        }
        var messages : [MessageModel] = []
        let decoder = JSONDecoder()
        guard
            let jsonData = try? JSONSerialization.data(withJSONObject:value),
            let message = try? decoder.decode(MessageModel.self, from: jsonData) else {
            compelition([])
            return
        }
        messages.append(message)
        compelition(messages)
    }
}

标签: listfirebase-realtime-databaseswiftuimemory-leaks

解决方案


推荐阅读