Представление таблицы в сегментированном элементе управления не показывает данные сразу - PullRequest
2 голосов
/ 12 октября 2019

У меня есть табличное представление под сегментированным элементом управления, данные табличного представления извлекаются из базы данных Firebase, вот код:

func retrieveParticipatedData(completion: @escaping (Bool) -> Void) {

    let storyIDRef = DBRef.child("Story IDs").child(userID!)
    var participatedStoryItems: [ParticipatedStoriesPageData] = []

    storyIDRef.observeSingleEvent(of: .value) { (snapshot) in
        if let dict = snapshot.value as? [String : String] {

            for (_, value) in dict {

                self.DBRef.child("To be reviewed stories").child(value).observeSingleEvent(of: .value) { (snapshot) in
                    if let storyDict = snapshot.value as? [String : Any] {

                        let storyTitle = storyDict["Book Title"] as? String
                        let storyDescription = storyDict["Description"] as? String
                        let storyID = value
                        let votes = storyDict["Votes"] as? Int

                        let story = ParticipatedStoriesPageData(storyKey: storyID, storyTitle: storyTitle!, storyDescription: storyDescription!, votes: votes!)
                        participatedStoryItems.append(story)
                    }
                    self.participatedStories = participatedStoryItems
                    completion(true)
                }
            }
        }
    }
}

override func viewDidLoad() {
    super.viewDidLoad()

    retrieveParticipatedData { (isRetreived) in

        if isRetreived {
            self.tableView.isHidden = false
            self.tableView.reloadData()
        }   
    }
}

Нет проблем с получением данных. Табличное представление и сегментированный элемент управления изначально скрыты, и после извлечения данных я их показываю.

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

Database

Participants database

Обновление

Вот что я попробовал с помощью Мэтта:

func retrieveParticipatedData() {

    let dispatchGroup = DispatchGroup()
    let storyIDRef = DBRef.child("Story IDs").child(userID!)
    var participatedStoryItems: [ParticipatedStoriesPageData] = []

    storyIDRef.observeSingleEvent(of: .value) { (snapshot) in
        if let dict = snapshot.value as? [String : String] {
            for (_, value) in dict {
                self.DBRef.child("To be reviewed stories").child(value).child("Participants").child("Chapter 1 Author").observeSingleEvent(of: .value) { (snapshot) in

                    if snapshot.value as? String == self.userID {
                        dispatchGroup.enter()

                        self.DBRef.child("To be reviewed stories").child(value).observeSingleEvent(of: .value) { (snapshot) in
                            if let storyDict = snapshot.value as? [String : Any] {

                                let storyTitle = storyDict["Book Title"] as? String
                                let storyDescription = storyDict["Description"] as? String
                                let storyID = value
                                let votes = storyDict["Votes"] as? Int

                                let story = ParticipatedStoriesPageData(storyKey: storyID, storyTitle: storyTitle!, storyDescription: storyDescription!, votes: votes!)
                                participatedStoryItems.append(story)
                            }
                            self.participatedStories = participatedStoryItems.reversed()
                            dispatchGroup.leave()
                        }
                        dispatchGroup.notify(queue: .main) {
                            print("Retrieved")
                            self.tableView.reloadData()
                        }
                        // It works if I do this
                        /*dispatchGroup.notify(queue: .main) {
                            print("Retrieved")
                            self.setupTableView // Creates the table view
                        }*/
                        //But I don't wanna do this cuz then there would be no table view if there is no data retreived.
                    }
                }
            }
        }
    }
}

override func viewDidLoad() {
    super.viewDidLoad()

    retrieveParticipatedData()
    setupStackView()
    setupTableView()  // Creates the table view
}

1 Ответ

0 голосов
/ 29 октября 2019

Приколите меня и попробуйте это. Не скрывайте свое табличное представление и просто вызовите эту функцию в вашем viewDidLoad (). Для своего приложения я загружаю длинный список пользователей и загружаю асинхронные фотографии профиля с сегментированным контроллером. Я могу ошибаться здесь, так как не могу проверить это на базе огня, но это похоже на то, что я делаю.

    func retrieveParticipatedData() {

    let storyIDRef = DBRef.child("Story IDs").child(userID!)
    var participatedStoryItems: [ParticipatedStoriesPageData] = []

    storyIDRef.observeSingleEvent(of: .value) { (snapshot) in
        if let dict = snapshot.value as? [String : String] {

            for (_, value) in dict {

                self.DBRef.child("To be reviewed stories").child(value).observeSingleEvent(of: .value) { (snapshot) in
                    if let storyDict = snapshot.value as? [String : Any] {

                        let storyTitle = storyDict["Book Title"] as? String
                        let storyDescription = storyDict["Description"] as? String
                        let storyID = value
                        let votes = storyDict["Votes"] as? Int

                        let story = ParticipatedStoriesPageData(storyKey: storyID, storyTitle: storyTitle!, storyDescription: storyDescription!, votes: votes!)
                        participatedStoryItems.append(story)
                    }
                    self.participatedStories = participatedStoryItems // should this be "append()" instead of "="? if not why not just call self.participatedStories.append(story) above instead?
                    self.tableView.reloadData()
                }
            }
        }
    }
}
...