无法从Firebase读取方法中提取var

时间:2019-01-14 14:10:27

标签: swift firebase

如何在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
    }

2 个答案:

答案 0 :(得分:1)

getDocumentasynchronous 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
    }
}

...在这里,您可以将其用于下一个目的