Как исправить проблему с запросами Firebase, когда запросы Firebase выполняются в неожиданном порядке? - PullRequest
0 голосов
/ 24 июня 2019

Четко сказано, что я пытаюсь выполнить: Я пытался получить посты, хранящиеся в firebase, и отобразить их в collectionView. Они должны быть отсортированы (в настоящее время успешно выполняются с помощью запросов Firebases) от самых новых к самым старым, я отслеживаю это в БД, используя метку времени:

ref.child("Timeline").child((Auth.auth().currentUser?.uid)!)
            .queryOrdered(byChild: "timeStamp")
            .queryLimited(toLast: 10)
            .observeSingleEvent(of: .value, with: { (snapshot) in

Для этого мне нужно сначала получить из текущей пользовательской шкалы 10 самых последних сообщений. Затем мне нужно в цикле for перейти в узел Post, в котором хранятся фактические записи и получать фактические данные постов. Затем, как только это будет сделано, мне нужно получить информацию о профиле пользователя, чтобы я мог отобразить имя пользователя и profileImage.


Я удаляю весь беспорядок из исходного вопроса, поскольку я определил проблемную зону.

Проблема начинается, как только я получаю метод fetchUsersPost в каждом цикле, показанном ниже:

                var index = 0
                for case let rest as DataSnapshot in snapshot.children.reversed() {
                    let keyValue = rest.key
                    let UID = keyValue.split(separator: ":")[0]
                    let postIDDoubleVal = keyValue.split(separator: ":")[2]

                    self.getPost(userID: "\(UID)", postID: "post:\(postIDDoubleVal)") { post in

                        self.postArray.append(post)
                        if index == (snapshot.children.allObjects.count)-1 {
                            print("Reload")
                            self.collectionView.reloadData()
                        } else {
                            index+=1
                        }
                    }
                }

При просмотре дат, напечатанных в операторе print внутри массива, я вижу такие значения, как: 21 ч назад-1 день назад, как и следовало ожидать Но, глядя на операторы print внутри замыкания, даты совпадают с явлением (проблемой), которое я видел в моем collectionView.

То есть: сообщения сортируются по дате, а затем группируются по пользователю или uid. В основном, избавление от порядка, который они имели.

Вот функция выборки:

    func getPost(userID: String, postID: String, completion: @escaping((_ completion: Post)->())) {
        let ref = Database.database().reference()

        ref.child("Posts/\(uid)/\(postID)").observeSingleEvent(of: .value, with: { snapshot in

            let userObj = User(theuserID: uid)

            self.retrieveUsersInfo(userObj: userObj) { user in
                print(user.username, " This is the username")
              }                    
        })
    }

Вот метод получения:

func retrieveUsersInfo(UID: String, completion: @escaping((_ user: User)->())) {

    let ref = Database.database().reference()

    ref.child("users2").child(UID).observeSingleEvent(of: .value, with: { (snapshot) in
        //this will return a userObj
        completion(self.addUserDataToObject(uid: UID, snapshot: snapshot))

    })
 }

Как это исправить?

1 Ответ

1 голос
/ 28 июня 2019

Вы пробовали что-то подобное?

func getPost(userID: String, postID: String, completion: @escaping((_ completion: Post)->())) {
    let ref = Database.database().reference()
    let post = Post()

    ref.child("users").child(UID).observeSingleEvent(of: .value, with: { (snapshot) in
        //get user data and add to post

    })
    ref.child("Posts/\(uid)/\(postID)").observeSingleEvent(of: .value, with: { snapshot in

       //add all data to your post object
       completion(post)
    })
}

Удалите функцию Retrive все вместе.Вот что имел в виду @Jay, когда сказал, что проблема может быть связана с блоками завершения.

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