我正在努力从firebase中提取数据并在表格视图中显示它。我使用接收到的数据填充数组并使用数组填充tableview,但数据未显示。
我意识到问题是tableview在数组填充之前加载。我试图在viewdidload中放入一个reloadData,但这会使数据在显示后弹出并且看起来不干净。
如何在视图出现之前让tableview加载数据,以便过渡顺利?
此代码位于我的viewdidload方法中:
let categoryRef = Database.database().reference().child("category/\(category)")
let user = Auth.auth().currentUser
if let user = user {
let uid = user.uid
categoryRef.observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.hasChildren(){
for child in (snapshot.value as? NSDictionary)! {
if let object = child.value as? [String:AnyObject]{
let name = object["name"] as! String
self.nameArray.append(name)
self.categoryDict["\(name)"] = child.key as! String
}
}
}
})
}
}
答案 0 :(得分:0)
尝试在添加所有子项后重新加载数据:
let categoryRef = Database.database().reference().child("category/\(category)")
let user = Auth.auth().currentUser
if let user = user {
let uid = user.uid
categoryRef.observeSingleEvent(of: .value, with: { (snapshot) in
if snapshot.hasChildren(){
for child in (snapshot.value as? NSDictionary)! {
if let object = child.value as? [String:AnyObject]{
let name = object["name"] as! String
self.nameArray.append(name)
self.categoryDict["\(name)"] = child.key as! String
}
}
self.tableView.reloadData()
}
})
}
}
答案 1 :(得分:0)
请拨打func insertSections(IndexSet, with: UITableViewRowAnimation)
,但请记住将其包含在对beginUpdates
和endUpdates
的调用中。另外,请确保在主队列中更新UI。
答案 2 :(得分:0)
因为
categoryRef.observeSingleEvent
是异步的,您应该在块完成后重新加载表视图,就像@barbarity建议的那样。
如果您想要更顺畅的过渡,请开始此次调用
let categoryRef = Database.database().reference().child("category/\(category)")
在展示你的viewController之前,设置数组然后呈现它。
但大多数情况下使用异步处理的做法是,开始在viewDidLoad上加载数据并具有UI加载机制(微调器)
答案 3 :(得分:0)
我想你可以制作其他观点,让你感觉数据准备就绪后会出现“数据弹出”的感觉。
在极端条件下,您可能会尝试隐藏整个tableview或甚至在屏幕上显示Activity Indicator,然后在tableview的数据准备就绪后显示tableview并隐藏指示符(在Objective-C中):
- (void)viewDidLoad {
//do init work ...
self.tableview.hidden = YES;
[self showIndicator];
[self requestDataFinish:^{
self.tableview.hidden = NO;
[self hideIndicator];
[self.tableview reload];
}];
}