我从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类中也没有任何项。
有人可以帮助我吗?预先感谢。
答案 0 :(得分:0)
Firebase实时数据库SDK是异步的,因此,在添加observe
调用时,您的意思是:“只要对此路径有更新,请调用此代码块”。
您有评论的地方是添加观察员之后的行,而不是观察员运行后的行。当您添加标记时,您尚无要添加的数据。您必须确保更新addMarker
时触发shopArray
调用。您可以将回调传递给getShops()
,也可以将观察者移动到视图控制器中,在该控制器中可以直接看到addMarker
函数。
一旦工作并理解了概念,就可以更轻松地进行重构以适合您的体系结构。看看Doug's medium post,了解为什么API异步以了解更多信息。