在viewdidload之前如何从Firebase获取数据

时间:2018-08-13 18:18:57

标签: firebase firebase-realtime-database swift4

我从firebase获取数据时遇到问题。这是我的网络课程。

class Networking {

static var instance = Networking()


var shopArray : [Shop] = []

func getShops() {

    Database.database().reference().child("eeb3215fgsfnuvj").child("shops").observe(.value) { snapshot in
        let shopsDictionary = snapshot.value as! NSDictionary

        for shop in shopsDictionary.allKeys {

            let tempShopDictionary = shopsDictionary[shop] as! NSDictionary

            self.shopArray.append(Shop(shopID: tempShopDictionary["shop_id"] as! Int, shopName: tempShopDictionary["shop_name"] as! String, shopLat: tempShopDictionary["shop_lat"] as! Double, shopLong: tempShopDictionary["shop_long"] as! Double, shopCategory: tempShopDictionary["shop_category"] as! String, shopLogo: tempShopDictionary["shop_logo"] as! String))

        }
        print(self.shopArray) 

    }

    print(shopArray) // I cant print data here...


}

正如我所说的,我可以在firebase代码块中打印数据,但不能在添加注释的行中打印

因此,我无法在视图控制器中看到我的数据。这是我的视图控制器类。

@IBOutlet weak var mapView: GMSMapView!
@IBOutlet weak var menuButton: UIButton!
@IBOutlet weak var sideBar: SideBarView!
@IBOutlet weak var leadingConstraint: NSLayoutConstraint!

var locationManager = CLLocationManager()
var isSideBarOpen : Bool = false


override func viewDidLoad() {
    super.viewDidLoad()


    mapView.delegate = self
    self.locationManager.delegate = self
    locationManager.requestWhenInUseAuthorization()

    Networking.instance.getShops()
    addMarker()

}




@IBAction func menuButtonTapped(_ sender: UIButton) {

    if isSideBarOpen {

        leadingConstraint.constant = -200

        UIView.animate(withDuration: 0.3) {
            self.view.layoutIfNeeded()
        }

    } else {
        leadingConstraint.constant = 0

        UIView.animate(withDuration: 0.3) {
            self.view.layoutIfNeeded()
        }

    }

    isSideBarOpen = !isSideBarOpen

}


func addMarker () {

    for marker in Networking.instance.shopArray {
        print(marker)
    }

    // I cant print marker as well


}

在addMarker函数中,您将看到我的注释行。在函数shopArray中,即使在Networking类中也没有任何项。

有人可以帮助我吗?预先感谢。

1 个答案:

答案 0 :(得分:0)

Firebase实时数据库SDK是异步的,因此,在添加observe调用时,您的意思是:“只要对此路径有更新,请调用此代码块”。

您有评论的地方是添加观察员之后的行,而不是观察员运行后的行。当您添加标记时,您尚无要添加的数据。您必须确保更新addMarker时触发shopArray调用。您可以将回调传递给getShops(),也可以将观察者移动到视图控制器中,在该控制器中可以直接看到addMarker函数。

一旦工作并理解了概念,就可以更轻松地进行重构以适合您的体系结构。看看Doug's medium post,了解为什么API异步以了解更多信息。