完成后在闭包内访问数据

时间:2017-04-18 09:04:37

标签: swift asynchronous firebase firebase-realtime-database closures

我希望能够在将所有数据从Firebase添加到我的阵列后访问结果数组。每次我尝试这个,我都会得到nil数组。

目标是在数组中列出位置信息对象,通过Firebase加载。

我的代码段:

    class func loadData(){
    let root = FIRDatabase.database().reference()
    let locationSummary = root.child("LocSummary")

    locationSummary.observe(.childAdded,with: { (snapshot) in
        print("inside closure")
        let values = snapshot.value as? NSDictionary
        let name = values?["Name"] as? String ?? ""
        let rating = values?["Rating"] as? Int
        let latitude = values?["Latitude"] as? Double
        let longitude = values?["Longitude"] as? Double
        let musicType = values?["Music"] as? String ?? ""

        let loc = LocationInfo.init(name: name, rating: rating!, lat: 
latitude!, long: longitude!, musicTyp: musicType)
        resultsArray.append(loc)


    })

}

1 个答案:

答案 0 :(得分:0)

尝试这样的事情:

class func loadData(completion: @escaping (_ location: LocationInfo) -> Void) {
    let root = FIRDatabase.database().reference()
    let locationSummary = root.child("LocSummary")

    locationSummary.observe(.childAdded,with: { (snapshot) in
        print("inside closure")
        let values = snapshot.value as? NSDictionary
        let name = values?["Name"] as? String ?? ""
        let rating = values?["Rating"] as? Int
        let latitude = values?["Latitude"] as? Double
        let longitude = values?["Longitude"] as? Double
        let musicType = values?["Music"] as? String ?? ""

        let loc = LocationInfo.init(name: name, rating: rating!, lat: 
latitude!, long: longitude!, musicTyp: musicType)
        completion(loc)
    })
}

在你的周期中添加如下内容:

func getArray(completion: @escaping (_ yourArray: [LocationInfo]) -> Void {
    var resultsArray = [LocationInfo]()
    let countOfLoadedItems = 0

    for item in yourArrayForCycle { // or your own cycle. Implement your logic
         loadData(completion: { location in
                         countOfLoadedItems += 1
                         resultsArray.append(location)
                         if countOfLoadedItems == yourArrayForCycle.count {
                             completion(resultsArray)
                         }
         })
    }
}

然后在功能中,您需要数据的位置:

getArray(completion: { result in 
    yourArrayToFill = result
    // reload data etc..
})

像这样的东西。使其适应您的解决方案。

希望有所帮助