【发布时间】:2020-09-12 14:42:53
【问题描述】:
我正在使用 Firestore 数据库和 Swift。
我有用户集合和一般任务集合。每个用户都有自己的任务集合。当用户注册时,我将任务从一般任务集合复制到用户自己的任务集合。
我的 Firestore 数据库层次结构如下所示:
任务 -> firstBundle -> 任务
用户 -> 用户 ID -> 任务
到现在一切正常。然后我想将用户任务集合中的数据加载到 UITableView。当我手动将任务添加到用户的任务集合中时,数据会显示在 tableview 中。但是当我将数据从一般任务集合复制到用户的任务集合时,数据根本不会显示在 tableview 中。
class TasksListScreen: UIViewController {
var db = Firestore.firestore()
var tasksArray = [Task]()
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
addTasks()
loadData()
}
手动将数据添加到用户的任务集合中,它可以工作(数据添加到数据库中,任务数据显示在表格视图中):
// push tasks to the db
func addTasks() {
let userID = Auth.auth().currentUser!.uid
let userTasksCollRef = db.collection("users").document(userID).collection("tasks")
userTasksCollRef.addDocument(data: [
"title": "Копійка гривню береже",
"description": "Копійка гривню береже, чули таке? Чи є у Вас скарбничка? Якщо немає - є ідея. Спробуйте створити скарбничку своїми руками. Яка вона буде - справа Ваша. І ще, порада, заповніть ії.",
"tip": "Живеться, якщо копійка ведеться",
"hashtags": "#гроші #збереження #своїми руками"
])
userTasksCollRef.addDocument(data: [
"title": "В здоровому тілі - здоровий дух",
"description": "Зробіть ранкову зарядку або пробіжку на свіжому повітрі.",
"tip": "Фізична активність значно покращує самопочуття на цілий день",
"hashtags": "#розвиток #фізична активність #здоров'я"
])
}
将一般任务集合中的数据(之前在数据库端手动填充)复制到用户的任务集合中,并将复制的数据添加到 tableview。
数据被复制并出现在 Firestore 数据库中的用户任务集合中,但未加载到表视图中。
// push tasks to the db
func addTasks() {
// copy from db.collection("tasks").document("firstBundle").collection("tasks") = tasksFirstBundleCollRef
// to db.collection("users").document(userID) = userRef
let userID = Auth.auth().currentUser!.uid
let userRef = db.collection("users").document(userID)
let tasksFirstBundleCollRef = db.collection("tasks").document("firstBundle").collection("tasks")
tasksFirstBundleCollRef.getDocuments { (querySnapshot, err) in
if let err = err {
print("Error getting documents: \(err.localizedDescription)")
} else {
if let snapshot = querySnapshot {
for document in snapshot.documents {
let data = document.data()
let batch = self.db.batch()
let docset = querySnapshot
let newCollRef = userRef.collection("tasks").document()
docset?.documents.forEach {_ in batch.setData(data, forDocument: newCollRef)}
batch.commit(completion: { (error) in
if let error = error {
print(error.localizedDescription)
} else {
print("Successfully copied doc")
}
})
}
}
}
}
}
这是我将数据从数据库加载到 tableview 的方法:
// load data to the table view from the db
func loadData() {
let userID = Auth.auth().currentUser!.uid
let userTasksCollRef = db.collection("users").document(userID).collection("tasks")
userTasksCollRef.getDocuments { (queryShapshot, error) in
if let error = error {
print("Error loading data: \(error.localizedDescription)")
} else {
self.tasksArray = queryShapshot!.documents.compactMap({Task(dictionary: $0.data())})
print("Data: \(self.tasksArray)")
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
}
我的任务文件:
protocol DocumentSerializable {
init?(dictionary:[String:Any])
}
struct Task {
var title: String
var description: String
var tip: String
var hashtags: String
var dictionary:[String:Any] {
return [
"title": title,
"description": description,
"tip": tip,
"hashtags": hashtags
]
}
}
extension Task : DocumentSerializable {
init?(dictionary: [String : Any]) {
guard let title = dictionary["title"] as? String,
let description = dictionary["description"] as? String,
let tip = dictionary["tip"] as? String,
let hashtags = dictionary["hashtags"] as? String else {return nil}
self.init(title: title, description: description, tip: tip, hashtags: hashtags)
}
}
【问题讨论】:
标签: ios swift firebase uitableview google-cloud-firestore