数据异步加载而不显示在 UITabBarController TableView 中?
Data loading asynchronously and not displaying in UITabBarController TableView?
我的应用程序是一个 UITabBarController
应用程序,当它第一次启动时,它需要调用我的 Firebase
数据库,以便我可以在其中一个选项卡中填充 UITableView
在 UITabBarController
。但是,我注意到我第一次登录并转到 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)
}
}
您应该正常转入,并在 UITableViewController 内部执行查询。调用查询回调后,您可以继续使用 -reloadData
重新加载 table,以便它填充单元格。
我的应用程序是一个 UITabBarController
应用程序,当它第一次启动时,它需要调用我的 Firebase
数据库,以便我可以在其中一个选项卡中填充 UITableView
在 UITabBarController
。但是,我注意到我第一次登录并转到 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)
}
}
您应该正常转入,并在 UITableViewController 内部执行查询。调用查询回调后,您可以继续使用 -reloadData
重新加载 table,以便它填充单元格。