2017-04-18 5 views
-1

すべてのデータがFirebaseから私の配列に追加された後、結果配列にアクセスできるようにします。私がこれを試すたびに、私は無の配列を得る。完了後のクロージャー内のデータへのアクセス

目的は、Firebase経由でロードされた配列内の位置情報オブジェクトのリストを持つことです。

マイコードスニペット:このような何かを追加

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

あなたのサイクルで:

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) 


    }) 

} 
+0

完了ハンドラを使用してください。 – shallowThought

+0

更新された回答を確認 –

+0

それはあなたを助けましたか? –

答えて

0

はこのような何かを試してみてください

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.. 
}) 

このようなものです。あなたのソリューションに合わせてください。

希望します。

+0

ありがとうございます。これは助ける:) –

+0

@MinonWeerasinghe聞いてうれしい:) –

関連する問題