【问题标题】:Cannot load data to the UITableView from Firestore database collection无法将数据从 Firestore 数据库集合加载到 UITableView
【发布时间】: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


    【解决方案1】:

    将以下内容添加到您的任务文件中:

    class func parseData(snapshot: QuerySnapshot?) -> [Post] {
        var tasks = [Task]()
    
        guard let snap = snapshot else { return posts }
        for document in snap.documents {
            let data = document.data()
            let title = data["title"] as? String ?? ""
            let description = data["description"] as? String ?? ""
            let tip = data["tip"] as? [String] as? String ?? ""
            let hashtags = data["hashtags"] as? String ?? ""
    
            let task = Task(title: title, description: description, tip: tip, hashtags: hashtags)
            tasks.append(task)
        }
    
        return tasks
    }
    

    然后尝试使用以下内容加载表:

    userTasksCollRef.getDocuments { (sapshot, error) in
        guard let snapshot = snapshot else {
           print("Error retrieving documents: \(error.debugDescription)")
           return
        }
        let task = Task.parseData(snapshot: snapshot)
        for task in tasks {
           self.tasksArray.append(task)
        }
        self.tableView.reloadData()
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-30
      • 2022-01-05
      • 2021-05-06
      • 2014-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多