我已经构建了2个应用程序,一个在Android上,另一个当前在Swift中(两者具有相同的业务功能)。我对后者还很陌生。它们都由Firestore集合提供,该集合也在上述应用程序中创建,然后分别通过回收者视图和表视图显示。
在一个非常奇怪的场景中,文档中的一个字段(地址字段在创建时是可选的)可能为空值。如果为null,则整个文档将被读取并显示在表格视图中;但如果不为null,则不会在表格视图中看到整个文档。这仅在iOS应用中发生。
如果我从对象中完全删除了地址字段,那么我会看到两种类型的文档,即,当该字段为null且该字段包含字符串值时。这种奇怪的情况在Android应用程序中不会发生。
我在做什么错了?
这是我的对象:
import Foundation
import FirebaseFirestore
protocol DocumentSerializable {
init?(dictionary:[String:Any])
}
struct Mealplan {
var planType: Int
var address: String
var Dictionary:[String : Any] {
return [
"planType": planType,
"address": address
]
}
extension Mealplan : DocumentSerializable {
init?(dictionary: [String : Any]) {
let address = dictionary["address"] as? String,
let planType = dictionary["planType"] as? Int
else { return nil }
self.init(planType: planType, address: address)
}
}
这是我在视图控制器中的查询功能:
func loadPlans() {
guard let user = Auth.auth().currentUser else { return }
let userPlans = db.collection("Plans").whereField("userId", isEqualTo: user!)
userPlans.getDocuments() { querySnapshot, error in
if let error = error {
print("\(error.localizedDescription)")
} else {
self.planArray = querySnapshot!.documents.compactMap({PlanOject(dictionary: $0.data())})
DispatchQueue.main.async {
self.planTableView.reloadData()
}
}
}
}
我可以理解,因为我将地址字段设置为字符串,所以它不会获取将其设置为null的文档,而是相反。
修改 具有DB结构;第一张图片的地址字段保存为字符串。在第二个地址中,该地址另存为空。