Проблема с использованием дочернего снимка внутри цикла - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть база данных Firebase со структурой "post / (randID)" и класс Post, который наследуется от класса Item.Я уже написал функцию снимка, которая правильно принимает значение всех дочерних узлов, но сейчас пытаюсь сделать только снимок записи / потомков, которые соответствуют элементам массива имен, которые у меня уже есть.

Я правильнополучение значений properly getting values, но не правильное добавление временных значений к моему массиву Item в точке останова.Любая помощь будет высоко ценится

----------- КОД -----------

func getWavePosts() {
    self.tempPosts = []

    for name in self.tempNames {
        var postRef = Database.database().reference().child("posts/\(name)")

        postRef.observe(.value, with: {snapshot in
            var test = snapshot.value as? [String:Any]
            var author = test!["author"] as? [String:Any]
            var uid = author!["uid"] as? String
            var username = author!["username"] as? String
            var photoURL = author!["photoURL"] as? String
            var url = URL(string: photoURL!)
            var imageURL = test!["imageURL"] as? String
            var text = test!["text"] as? String
            var timestamp = test!["timestamp"] as? Double
            var userProfile = UserProfile(uid: uid!, username: username!, photoURL: url!)
            var post = Post(id: name, author: userProfile, text: text!, timestamp: timestamp!, imageURL: imageURL!)
            self.tempPosts.append(post)

            //print(self.tempPosts)
            //self.items = self.tempPosts
        })
       //self.items = self.tempPosts
    }
    print(self.tempPosts.count)
    print(self.items.count)
}

1 Ответ

0 голосов
/ 19 декабря 2018

Во-первых, ваша функция должна иметь completion с массивом Post в качестве параметра

func getWavePosts(_ completion: @escaping ([Post]) -> () )

... теперь давайте встретимся с DispatchGroup.

Сначала объявим новый DispatchGroup перед циклом foreach.Затем, перед тем как вы observe postRef войдете в dispatchGroup и после добавления полученного Post к массиву (определите этот массив в функции, не используйте глобальную переменную), оставьте dispatchGroup.Когда каждый Post добавляется в массив, вызывайте completion при закрытии dispatchGroup.notify(queue:)

func getWavePosts(_ completion: @escaping ([Post]) -> () ) {

    var tempPosts = []

    let dispatchGroup = DispatchGroup()

    for name in self.tempNames {

        dispatchGroup.enter()

        var postRef = Database.database().reference().child("posts/\(name)")

        postRef.observe(.value, with: { snapshot in
            ...
            tempPosts.append(post)
            dispatchGroup.leave()
        })
    }
    dispatchGroup.notify(queue: .main) {
        completion(tempPosts)
    }
}

Затем у вас есть доступ к полученным сообщениям при закрытии этого метода, когда вы вызываете его

getWavePosts { posts in
    ... // do whatever you want to
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...