在用户看到之前在表视图中显示数组

时间:2017-12-31 00:48:13

标签: ios swift

我正在努力从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
                    }

                }
            }

        })
    }

}

4 个答案:

答案 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),但请记住将其包含在对beginUpdatesendUpdates的调用中。另外,请确保在主队列中更新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];
    }];        

}