簡體   English   中英

我應該始終手動分離 Firestore 偵聽器嗎?

[英]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.

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