简体   繁体   English

Firebase和Swift:在获取数据后执行segue

[英]Firebase & Swift: Performing segue after fetching data

When people log in to my app, I take some data from the database like this: 当人们登录我的应用程序时,我从数据库中获取一些数据,如下所示:

func DownloadButikker() {
    self.ref?.child("Stores").observe(.childAdded, with: { (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject] {
            let store = Store()
            store.Latitude = dictionary["Latitude"]?.doubleValue
            store.Longitude = dictionary["Longitude"]?.doubleValue
            store.Store = dictionary["Store"] as? String
            store.Status = dictionary["Status"] as? String
            stores.append(store)
        }
    })
    self.performSegue(withIdentifier: "LogInToMain", sender: nil)
}

I perform the segue before all data has finished loading. 我在所有数据完成加载之前执行segue。 Are there any way to get a completion to the observer or check if all data is loaded before making the segue? 有什么方法可以让观察者完成任务或在进行segue之前检查是否已加载所有数据?

The quick solution is that you need to perform your segue after finishing your async call. 快速的解决方案是您需要完成异步调用执行segue。

func DownloadButikker() {
    self.ref?.child("Stores").observe(.childAdded, with: { (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject] {
            let store = Store()
            store.Latitude = dictionary["Latitude"]?.doubleValue
            store.Longitude = dictionary["Longitude"]?.doubleValue
            store.Store = dictionary["Store"] as? String
            store.Status = dictionary["Status"] as? String
            stores.append(store)
        }
        DispatchQueue.main.async {
          self.performSegue(withIdentifier: "LogInToMain", sender: nil)
        }
    })
}
func DownloadButikker(completion: Bool = false) {
    self.ref?.child("Stores").observe(.childAdded, with: { (snapshot) in
        if let dictionary = snapshot.value as? [String: AnyObject] {
            let store = Store()
            store.Latitude = dictionary["Latitude"]?.doubleValue
            store.Longitude = dictionary["Longitude"]?.doubleValue
            store.Store = dictionary["Store"] as? String
            store.Status = dictionary["Status"] as? String
            stores.append(store)
            completion(true)
        }
    })
}


// In your ViewController
func myFunction() {
   DownloadButikker { (hasFinished) in
      if hasFinished { 
         self.performSegue(withIdentifier: "LogInToMain", sender: nil)
      }
   }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM