list - 内存泄漏与 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)
}
}
解决方案
推荐阅读
- python - 如何在 python 中使用 xarray 将气候数据集相乘?
- python - ML 笔记本中的 Azure Batch API 上升“AttributeError”
- javascript - 将 CSS 应用于通过 JavaScript 加载的 iframe
- python - cli中的python双制表符仅显示兼容文件
- spring - Hazelcast 嵌入式缓存打印太多日志(目标是此节点!-> [10.1.8.58]:5701","stack_trace":"<#d3566be0> jlIllegalArgumentException...)
- mysql - 解决导致数据库被阻塞的 MySQL 连接问题
- sqlite - 未找到 Apache Airflow 提供程序 Sqlite 模块/钩子“airflow.hooks.dbapi import DbApiHook”错误
- javascript - 看到错误 - “[match] query malformed, no start_object after query name”不知道为什么
- reactjs - 如何在 React JS 中隐藏/显示提交按钮
- oracle-cloud-infrastructure - Oracle 云基础设施 – 跨区域获得计算形态?