Не удается загрузить данные в UITableView из коллекции базы данных Firestore - PullRequest
1 голос
/ 26 мая 2020

Я использую базу данных Firestore и Swift.
У меня есть набор пользователей и общий набор задач. У каждого пользователя свой набор задач. Когда пользователь регистрируется, я копирую задачи из общего набора задач в собственный набор задач пользователя.

Моя иерархия базы данных Firestore выглядит так:
задачи -> firstBundle -> задачи
пользователи -> userID -> задачи

Все работает до сих пор. Затем я хочу загрузить данные из пользовательской коллекции задач в UITableView. Когда я вручную добавляю задачи в коллекцию задач пользователя, данные отображаются в виде таблицы. Но когда я копирую данные из общего набора задач в набор задач пользователя, данные вообще не отображаются в табличном представлении.

  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": "#розвиток #фізична активність #здоров'я"
        ])
     }

Скопируйте данные из общей коллекции задач (которая была заполнена до этого вручную на стороне базы данных) в пользовательскую коллекцию задачи и добавить скопированные данные в табличное представление.
Данные копируются и появляются в коллекции задач пользователя в базе данных 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()
                }
            }
        }
    }

Файл My Task:

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)
    }
}

1 Ответ

0 голосов
/ 26 мая 2020

Добавьте в свой файл задачи следующее:

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()
}
...