Я загружаю данные в Firestore следующим образом:
func uploadTrackedSymptomValues(symptom: String, comment: String, time: String, timestamp: Int) {
print("Uploading symptom values.")
let user_id = FirebaseManager.shared.user_id
let docRef = db.collection("users").document(user_id!).collection("symptom_data").document("\(symptom)_data")
let updateData = [String(timestamp) : ["symptom" : symptom, "severity" : severity, "comment" : comment, "timestamp" : String(timestamp)]]
docRef.setData(updateData, merge: true)
docRef.setData(updateData, merge: true) { (err) in
if err != nil {
print(err?.localizedDescription as Any)
self.view.makeToast(err?.localizedDescription as! String)
} else {
print("Symptom Data Uploaded")
self.view.makeToast("\(symptom) logged at \(time). Severity: \(self.severity). Comment: \(comment)", duration: 2.0, position: .center, title: "Success!", image: self.cellImage) { didTap in
if didTap {
print("completion from tap")
} else {
print("completion without tap")
}
}
}
}
}
На Firestore это выглядит так:
Теперь я хочу использовать каждое поле вотметка времени для UITableViewCell
Но я не уверен, как получить доступ к полю под документом, например, 1556998898
в Anxiety_data
, поэтому я могу получить доступ к:
comment = "comment";
severity = "Mild";
symptom = "Anxiety";
timestamp = 1556998898;
Для использования в UITableViewCell, С базой данных в реальном времени я бы использовал childAdded listener
.Я пытался:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let index = indexPath.row
let cell = tableView.dequeueReusableCell(withIdentifier: "EntryDataCell", for: indexPath) as! EntryDataCell
cell.configureCustomCell()
let user_id = FirebaseManager.shared.user_id
let symptomRef = db.collection("users").document(user_id!).collection("symptom_data").document(symptomSections[index])
symptomRef.getDocument(completion: { (document, err) in
if let document = document, document.exists {
let dataDescription = document.data().map(String.init(describing:)) ?? "nil"
print("\(document.documentID) : \(dataDescription)")
cell.commentLabel.text = dataDescription //<- Stuck here
} else {
print("Document does not exist")
}
})
return cell
}
Но я застрял в том, как бы получить конкретное поле, так как я не знаю имени, так как это временная метка, когда оно было сделано, а не весьдокумент.Если есть лучший способ справиться с этим, пожалуйста, дайте мне знать.Спасибо.
РЕДАКТИРОВАТЬ:
Я могу получить ключ (метка времени) и значения, но у меня возникают проблемы при синтаксическом анализе значений:
let obj = dataDescription
for (key, value) in obj! {
print("Property: \"\(key as String)\"") //<- prints Timestamp
print("Value: \"\(value)\"") // <- prints the comment,severity,symptom,timestamp fields I need.
}
Если я пытаюсьdo cell.titleLabel.text = value["comment"]
Я получаю Value of type 'Any' has no subscripts
Я думал об использовании структуры:
struct FieldValues: Codable {
let comment: String
let severity: String
let symptom: String
let timestamp: Int
}
Но я не уверен, как использовать ее с value
.Я чувствую, что нахожусь немного над моей головой для этой последней части.