Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift&x2B;didFinishLaunchingWithOptions中的Firebase预加载数据_Swift_Firebase_Firebase Realtime Database - Fatal编程技术网

Swift&x2B;didFinishLaunchingWithOptions中的Firebase预加载数据

Swift&x2B;didFinishLaunchingWithOptions中的Firebase预加载数据,swift,firebase,firebase-realtime-database,Swift,Firebase,Firebase Realtime Database,我正在实现一个从Firebase提取数据的tableview。我的tableview分为几个部分,这些部分动态地依赖于Firebase中的条目,在viewdidload中检索数据会使应用程序崩溃 如何在查看DidLoad之前使用选项从DidFinishLaunching中的Firebase中提取数据?这个tableview是我的第一个视图控制器 func application(application: UIApplication, didFinishLaunchingWithOptions l

我正在实现一个从Firebase提取数据的tableview。我的tableview分为几个部分,这些部分动态地依赖于Firebase中的条目,在viewdidload中检索数据会使应用程序崩溃

如何在查看DidLoad之前使用选项从DidFinishLaunching中的Firebase中提取数据?这个tableview是我的第一个视图控制器

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    FIRApp.configure()
    return true
}
//在tableview控制器中

class MyTableViewController: UITableViewController {

var ref: FIRDatabaseReference!
private var _refHandle: FIRDatabaseHandle!
var mileageDatabase: [FIRDataSnapshot]! = []
var dates: [(String)] = []

override func viewDidLoad() {
    super.viewDidLoad()
    print("View did load \(self.dates)")
    configureDatabase()

    self.tableView = UITableView(frame: self.tableView.frame, style: .Grouped)

}



func configureDatabase() {
    ref = FIRDatabase.database().reference()

    _refHandle = self.ref.child("mileage").observeEventType(.ChildAdded, withBlock: { (snapshot) in
        self.mileageDatabase.append(snapshot)
        self.tableView.insertRowsAtIndexPaths([NSIndexPath(forRow: self.mileageDatabase.count - 1, inSection: 0)].reverse(), withRowAnimation: .Automatic)


    })

self.ref.child("mileage").queryOrderedByChild("date").observeEventType(.ChildAdded, withBlock: { (snapshot) in
       print(snapshot.value?["date"])
       self.dates.append(snapshot.value?["date"] as! String)            
       // Here I will do some magic to sort out unique dates
    })

}

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {

      return self.dates.count
}

好的,你可以选择全局变量。您可以将其声明为全局变量,而不是在
MyTableViewController
中声明变量“dates”

公共变量日期:[(字符串)]=[]

代码应该在任何类的作用域之外

现在将以下代码移动到
func应用程序(应用程序:UIApplication,didfishlaunchingwithoptions启动选项:[NSObject:AnyObject]?)->Bool

ref = FIRDatabase.database().reference()

ref.child("mileage").queryOrderedByChild("date").observeEventType(.ChildAdded, withBlock: { (snapshot) in
       print(snapshot.value?["date"])
      dates.append(snapshot.value?["date"] as! String)            
       // Here I will do some magic to sort out unique dates
    })

您将在
viewdiload

时获得数据。好的,您可以选择全局变量。您可以将其声明为全局变量,而不是在
MyTableViewController
中声明变量“dates”

公共变量日期:[(字符串)]=[]

代码应该在任何类的作用域之外

现在将以下代码移动到
func应用程序(应用程序:UIApplication,didfishlaunchingwithoptions启动选项:[NSObject:AnyObject]?)->Bool

ref = FIRDatabase.database().reference()

ref.child("mileage").queryOrderedByChild("date").observeEventType(.ChildAdded, withBlock: { (snapshot) in
       print(snapshot.value?["date"])
      dates.append(snapshot.value?["date"] as! String)            
       // Here I will do some magic to sort out unique dates
    })

您将在
viewdiload

时拥有数据。您可以在此处粘贴加载数据的方式吗?您可以在此处粘贴加载数据的方式吗?@rejithr但它不起作用。我将上面的代码放置在didFinishLaunchingWithOptions,并将日期声明为全局变量,但Firebase仍然在viewDidLoad之后调用代码。好的,理想情况下不应该这样做。您的回拨可能会延迟。如果这不能解决问题,那么在获取数据后调用tableview.reload()。您可以显示空白屏幕或活动指示器。刚才我用我的代码尝试了同样的方法,我之前得到了响应viewdidLoad@rejithr但它不起作用。我将上面的代码放置在didFinishLaunchingWithOptions,并将日期声明为全局变量,但Firebase仍然在viewDidLoad之后调用代码。好的,理想情况下不应该这样做。您的回拨可能会延迟。如果这不能解决问题,那么在获取数据后调用tableview.reload()。您可以显示空白屏幕或活动指示器。刚才我用我的代码做了同样的尝试,我在viewdidLoad之前得到了响应