#swift #google-cloud-firestore
# #swift #google-облако-firestore
Вопрос:
Мне нужно запросить множество коллекций, и модели всегда определяются примерно так:
struct Order : Identifiable, Codable {
@DocumentID var id : String?
let fieldOne : String?
let fieldTwo : Int?
enum CodingKeys : String, CodingKey {
case id // (had to comment this out)
case fieldOne
case fieldTwo
}
}
Сегодня я потратил весь день, пытаясь понять, почему я не могу загрузить документы из одной конкретной коллекции. Я получал снимок с документами, но не мог преобразовать и заполнить их в массив. После нескольких часов проб и ошибок я закомментировал «идентификатор обращения» в перечислении и заставил его работать.
Есть идеи, почему это происходит?
Вот запрос, который работает С идентификатором обращения:
listener = db.collection("Meal_Plans").whereField("userId", isEqualTo: userEmail).order(by: "timeOfCreation", descending: true).addSnapshotListener({ (querySnapshot, error) in
if let error = error {
print("error in mp query: (error.localizedDescription)")
} else {
guard let documents = querySnapshot?.documents else {
print("No mealplans")
return
}
let mealplanArray: [Mealplan] = documents.compactMap { queryDocumentSnapshot -> Mealplan? in
return try? queryDocumentSnapshot.data(as: Mealplan.self)
}
let planViewModel = mealplanArray.map({return PlanViewModel(mealplan: $0)})
DispatchQueue.main.async {
if mealplanArray.count > 0 {
self.planViewModelDelegate?.plansFetched(self.updateHour(sourcePlans: planViewModel))
}
}
}
})
И это тот, у которого НЕТ:
listener = db.collection("Placed_Orders").whereField("userId", isEqualTo: userId).whereField("status", isLessThan: 410).order(by: "status", descending: false).order(by: "nextOrderDate", descending: false).addSnapshotListener({ (documentSnapshot, error) in
if let error = error {
print("error")
self.orderCallback?(error.localizedDescription, nil, .error)
} else {
print("empty")
guard let documents = documentSnapshot?.documents else {
return }
if documents.isEmpty {
self.orderCallback?("No orders found", nil, .error)
return
} else {
print("snapshot count: (documents.count)")
let orderArray: [Order] = documents.compactMap { queryDocumentSnapshot -> Order? in
return try? queryDocumentSnapshot.data(as: Order.self)
}
let orderViewModel = orderArray.map({ return OrderViewModel(order: $0)})
print("array count: (orderArray.count)")
DispatchQueue.main.async {
print("status: (orderViewModel)")
self.orderCallback?(nil, orderViewModel, .success)
}
}
}
})
Различия довольно тонкие. В обоих случаях я использую прослушиватель моментальных снимков для запроса моментального снимка и заполнения его в массив, а затем отображения этого массива в модель представления.
Тем не менее, в последнем случае я должен закомментировать идентификатор обращения для идентифицируемого поля. Мне нужен идентификатор, поэтому мне нужно посмотреть, работает ли он, но я хотел бы знать, почему я должен комментировать идентификатор обращения.