Не следует добавлять код доступа к данным в представлениях SwiftUI. Вместо этого реализуйте модель представления (и, необязательно, хранилище) для управления вашими данными.
Я немного адаптировал ваш код:
Представление
struct ShoppingCartView: View {
@ObservedObject var viewModel: ShoppingCartViewModel
var body: some View {
List {
ForEach(viewModel.lineItems) { lineItem in
VStack(alignment: .leading) {
Text(lineItem.title)
.font(.headline)
}
}
.onDelete { indexSet in
self.viewModel.deleteLineItems(at: indexSet)
}
}
}
}
Просмотр модели
import Foundation
import FirebaseFirestore
import FirebaseFirestoreSwift
import Combine
class ShoppingCartViewModel: ObservableObject {
@Published var lineItems = [LineItem]()
private var db = Firestore.firestore()
private var listenerRegistration: ListenerRegistration?
private var cancellables = Set<AnyCancellable>()
init() {
fetchData()
}
deinit {
unregister()
}
func unregister() {
if listenerRegistration != nil {
listenerRegistration?.remove()
}
}
func fetchData() {
unregister()
listenerRegistration = db.collection("shoppingCart").addSnapshotListener { (querySnapshot, error) in
guard let documents = querySnapshot?.documents else {
print("No documents")
return
}
self.lineItems = documents.compactMap { queryDocumentSnapshot -> LineItem? in
let lineItem = try? queryDocumentSnapshot.data(as: LineItem.self)
return lineItem
}
}
}
func deleteLineItems(at offsets: IndexSet) {
let itemsToDelete = offsets.lazy.map { self.lineItems[$0] }
itemsToDelete.forEach { lineItem in
if let id = lineItem.id {
db.collection("shoppingCart").document(id).delete()
}
}
}
}