У меня есть табличное представление под сегментированным элементом управления, данные табличного представления извлекаются из базы данных 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 вкладки в моем сегментированном элементе управления), только тогда данные отображаются в виде таблицы. Я также добавил изображение базы данных.
Обновление
Вот что я попробовал с помощью Мэтта:
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
}