如何在Swift中从Firebase的读取方法中删除numberOfMarkers
?
如果我在{}
中使用该函数,它将保存并可以在{}
中使用它吗?
docRef = Firestore.firestore().document("Markol/Markers")
docRef.getDocument{ (docSnapshot, error) in
guard let docSnapshot = docSnapshot, docSnapshot.exists else {return}
let myData = docSnapshot.data()
let numberOfMarkers = myData?["NumberofMarkers"] as? Int ?? 0
}
//Here i want to get the let numberOfMarkers
var markerArrayList = [GMSMarker]()
func makeAMarker(_ Latitude:Double , _ Longitude:Double , _ Title:String,Snippet:String) -> GMSMarker{
let GmMarker = GMSMarker()
GmMarker.position = CLLocationCoordinate2D(latitude: CLLocationDegrees(Latitude), longitude: CLLocationDegrees(Longitude))
GmMarker.title = Title
GmMarker.snippet = Snippet
GmMarker.icon = UIImage(named: "smallStoreIcon")
return GmMarker
}
答案 0 :(得分:1)
getDocument
是asynchronous task,因此numberOfMarkers
仅在结束}
之前可访问。
使用numberOfMarkers
侦听器中的getDocument
做任何您想做的事情,您可能需要重构您现有的代码以适应这种情况。例如:
docRef = Firestore.firestore().document("Markol/Markers")
docRef.getDocument{ (docSnapshot, error) in
guard let docSnapshot = docSnapshot, docSnapshot.exists else {return}
let myData = docSnapshot.data()
let numberOfMarkers = myData?["NumberofMarkers"] as? Int ?? 0
processMarkers(numberOfMarkers, myData)
}
如果这种方法不清楚,请尝试在问题中发布更多代码,以便其他人可以帮助您进行重组。
答案 1 :(得分:0)
不,你不能。变量/常量总是在大括号{...}
之间的声明范围内始终可见。
您可能想要做的就是获取此值以将其返回或在其他地方使用。请勿这样做,因为从Firestore
获取数据是异步任务,因此请改用完成处理程序,并在完成时返回值(或nil
(如果没有值))作为完成的参数>
func call(completion: @escaping (Int?) -> Void) {
...
docRef.getDocument{ docSnapshot, error in
guard let docSnapshot = docSnapshot, docSnapshot.exists else {
completion(nil)
return
}
let myData = docSnapshot.data()
let numberOfMarkers = myData?["NumberofMarkers"] as? Int
completion(numberOfMarkers)
}
}
然后在您需要调用它时
call { numberOfMarkers in // code inside this closure is called with parameter of type `Int?` when you receive data and call completion from inside `call`
if let number = numberOfMarkers {
... // do something with it
}
}
...在这里,您可以将其用于下一个目的