Итерация по коллекции внутри документа внутри коллекции в базе данных Firebase с использованием Cloud Firestore - PullRequest
0 голосов
/ 30 апреля 2020

Я работаю над приложением в стиле Instagram, в котором есть сообщения и несколько пользователей. Облачное хранилище пожаров структурировано следующим образом:

Коллекция: «Пользователи» -> Документы: «имя пользователя» -> Коллекция: «Сообщения» -> Документы: «отдельные сообщения»

Как вы видите, я настроил его так, чтобы коллекция Users содержала кучу документов, каждый из которых представлял имя пользователя для всех пользователей, использующих приложение. Каждый документ с именем пользователя имеет свою собственную коллекцию, называемую «Сообщения», в которой хранятся все сделанные им сообщения, и каждая публикация является документом в этой коллекции.

Мой вопрос: как я могу получить доступ к этой коллекции сообщений для каждого пользователя в моя база данных?

Сейчас я пытаюсь перебрать все документы с именами пользователей в коллекции Users, получить доступ к их коллекции Posts и вызвать функцию в этой коллекции, которая уже работает, которая создает и добавляет сообщения в фид. Моя проблема в том, что я могу получить доступ к этой коллекции сообщений, которая так глубоко вложена в облачное хранилище пожаров.

func allUsers() {
        let users = db.collection("Users")
        users.getDocuments { (snapshot, error) in
            if error != nil {
                debugPrint("Error getting the users from firebase.")
            } else {
                for document in (snapshot?.documents)! {
                    self.getPost(document: document)
                }
            }
        }
    }

Вот как я пытаюсь перебрать каждое имя пользователя. Для каждого имени пользователя в коллекции User я вызываю свою функцию getPost.

func getPost(document : QueryDocumentSnapshot) {
        let theData = document.data()
        let theDocument = theData["Posts"] as? CollectionReference
        theDocument!.getDocuments { (snapshot, error) in
            if error != nil {
                debugPrint("Error getting the data from firebase.")
            } else {
                for document in (snapshot?.documents)! {
                    let _data = document.data()
                    let _image = _data["image"] as? String ?? "Anonymous"
                    let _username = _data["username"] as? String ?? "Anonymous"
                    let _location = _data["location"] as? String ?? "Anonymous"
                    let _description = _data["description"] as? String ?? "Anonymous"
                    let _quantity = _data["quantity"] as? String ?? "Anonymous"
                    let _phone = _data["phone"] as? String ?? "Anonymous"
                    let _date = _data["date"] as? Date ?? Date()
                    // Points to the storage
                    let _storageRef = storage.reference()
                    // Points to the images folder
                    let _folderRef = _storageRef.child("images")
                    // Points to the the image under the images folder
                    let _fileRef = _folderRef.child("\(_image).jpg")
                    //get the associated post image
                    _fileRef.getData(maxSize: 10 * 1024 * 1024) { (data, error) in
                        // Create a UIImage, add it to the array
                        if let error = error {
                            print(error)
                        } else {
                            let loadedImage = UIImage(data: data!)
                            self.addToPrevious(thePost: Post(image: loadedImage, username: _username, location: _location, description: _description, quantity: _quantity, phone: _phone, date: _date))
                            self.posts.append(Post(image: loadedImage, username: _username, location: _location, description: _description, quantity: _quantity, phone: _phone, date: _date))
                        }
                    }
                }
            }
        }
    }

Я пробежал через отладчик и в моей функции allUsers он не видит никаких документов (которые являются именами пользователей) в коллекции Users. Однако в коллекции Users определенно есть документы с именами пользователей, поэтому я не уверен, почему она их не видит

Мой главный вопрос: как я могу перебрать подколлекцию Posts? Причина, по которой мне нужно это сделать, заключается в том, что в приложении есть основной канал для каждого пользователя, и этот основной канал должен отображать сообщения всех остальных пользователей приложения. Мне нужно было бы получить доступ к сообщениям каждого другого пользователя, чтобы выполнить эту задачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...