【问题标题】:Data loading asynchronously and not displaying in UITabBarController TableView?数据异步加载而不显示在 UITabBarController TableView 中?
【发布时间】:2015-04-11 02:07:55
【问题描述】:

我的应用程序是一个UITabBarController 应用程序,当它第一次启动时,它需要调用我的Firebase 数据库,以便我可以在UITabBarController 的一个选项卡中填充UITableView。但是,我注意到我第一次登录并转到TabBarController 时,数据没有显示。我必须从该选项卡转到另一个选项卡,然后返回原始选项卡以显示数据。但是,我希望它能够第一次显示数据。我知道这是一个错误,因为 Firebase 异步抓取数据并且视图在处理所有数据之前加载,但我似乎无法让它按预期工作。

我尝试在执行 segue 之前先查询我们想要的所有值,将它们存储到一个数组中,然后将该数组发送到 OffersView 中的预定义数组,但这似乎不起作用。这是我的尝试:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if(segue.identifier == "OffersView"){
      let barViewControllers = segue.destinationViewController as UITabBarController
        let navigationOfferController = barViewControllers.viewControllers![0] as UINavigationController
        let offersViewController = navigationOfferController.topViewController as OffersView
        offersViewController.offers = offersQuery()
    }

func offersQuery() -> [Offer]{

    firebaseRef = Firebase(url:"https://OffersDB.firebaseio.com/offers")

    //Read the data at our posts reference
    firebaseRef.observeEventType(FEventType.ChildAdded, withBlock: { (snapshot) -> Void in

        let restaurant = snapshot.value["restaurant"] as? String


        let offer = Offer(restaurant: restaurant)

        //Maintain array of offers
        self.offers.append(offer)
        }) { (error) -> Void in
            println(error.description)
    }
    return offers
}

任何帮助将不胜感激!

编辑:每次发生 childAdded 调用时,我都尝试使用完成处理程序,并且我正在尝试这样做,但我似乎无法让它工作。我收到一条错误消息:'NSInternalInconsistencyException', reason: 'attempt to insert row 1 into section 0, but there are only 1 rows in section 0 after the update

setupOffers { (result) -> Void in
        if(result == true){
            var row = self.offers.count
            self.tableView.beginUpdates()
            var indexPaths = NSIndexPath(forRow: row, inSection: 0)
            println(indexPaths)
            self.tableView.insertRowsAtIndexPaths([indexPaths], withRowAnimation: UITableViewRowAnimation.Bottom)
        }
    }

【问题讨论】:

    标签: ios uitableview swift asynchronous firebase


    【解决方案1】:

    您应该正常进行segue,并在UITableViewController 中执行查询。调用查询回调后,您可以继续使用-reloadData 重新加载表格,以便填充单元格。

    【讨论】:

    • 我如何知道我的查询回调何时成功完成?这就是我正在努力的部分。另外我没有使用 UITableViewController,我只是使用 TableView(虽然不确定这是否会改变)。
    • 您可以做的是,或者每次调用 FEventType.ChildAdded 时,您希望在更新模型后对 tableView 执行-insertRowsAtIndexPaths:withRowAnimation:。这样,您的优惠将一一顺利加载到 tableView 中,而无需使用完成处理程序进行批量更新。
    • 嗯,有道理。如果我似乎无法使其工作,我将尝试实施并回复您。我想知道,你能给我一些关于如何使用完成处理程序进行批量更新的提示吗?我对 Swift 有点陌生,所以我不知道这完全意味着什么。
    • 另外,我们如何知道 FEventType.ChildAdded 何时结束调用?就在函数声明的末尾?
    • 您是否将对象添加到您的模型中(即您的对象数组)?似乎您调用了该方法,但-tableView:numberOfRowsInSection: 仍然返回旧金额(因此添加失败)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 2021-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多