![](/img/trans.png)
[英]How to detach a listener for a Firestore collection made with AngularFire?
[英]Should I always manually detach the Firestore listener?
我將 Firestore 與 SwiftUI 一起使用。我不確定如何處理列表器以避免從 Firestore 進行不必要的讀取。
當我點擊Text("Books")
,從BooksView
彈出,然后再次點擊Text("Books")
時,如果我沒有在deinit
中調用listener?.remove()
,我會有兩個聽眾還是只有一個聽眾? 成本是否也會翻倍?
換句話說,偵聽器足夠聰明,可以在第二次調用.addSnapshotListener
時分離同一個偵聽器?
我是否應該始終像在deinit
中調用listener?.remove()
一樣手動分離 lister?
在不分離偵聽器、打開它並附加新偵聽器的情況下終止應用程序怎么樣?
示例代碼:
struct ContentView: View {
var body: some View {
NavigationView {
NavigationLink(destination: BooksView()) {
Text("Books")
}
}
}
}
struct BooksView: View {
@StateObject var booksViewModel = BooksViewModel()
var body: some View {
Text("Hello, world!")
.padding()
}
}
class BooksViewModel: ObservableObject {
@Published var books = [Book]()
private var db = Firestore.firestore()
private var listener: ListenerRegistration?
init() {
fetchData()
}
func fetchData() {
listener = db.collection("books").addSnapshotListener { (querySnapshot, error) in
guard let documents = querySnapshot?.documents else {
print("No documents")
return
}
self.books = documents.map { queryDocumentSnapshot -> Book in
let data = queryDocumentSnapshot.data()
let title = data["title"] as? String ?? ""
let author = data["author"] as? String ?? ""
let numberOfPages = data["pages"] as? Int ?? 0
return Book(id: .init(), title: title, author: author, numberOfPages: numberOfPages)
}
}
}
}
這是否有必要避免不必要的閱讀?
deinit {
listener?.remove()
}
換句話說,偵聽器足夠聰明,可以在第二次調用.addSnapshotListener 時分離同一個偵聽器?
不,這不對。 您必須在不再需要時手動刪除任何偵聽器。
在不分離偵聽器、打開它並附加新偵聽器的情況下終止應用程序怎么樣?
如果應用進程終止,那么監聽器顯然會 go 離開(因為程序沒有運行)。 如果您想要更多更新,則必須在應用再次啟動時添加新的偵聽器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.