使用Firebase异步字典下载(Swift)创建一个对象数组

时间:2016-05-13 19:46:40

标签: ios arrays swift dictionary firebase

我是Swift的新手。我在下载Firebase词典并将其转换为对象数组时遇到了问题。

我在下面的语法中做错了什么?过去两天我花了很多时间试图解决这个问题。以下给出了索引超出范围的错误。这是因为Firebase词典还没有完成下载还是我的for循环sytax有缺陷?也许两者都?感谢。

 // Array of Location Objects
 var locationsArray:[Location] = [Location]()

 var ref = Firebase(url: "<MYFIREBASEURL>")
 var dictionaryOfRecommendations:[NSDictionary] = [NSDictionary]()
 var currentlyConstructingLocation:Location = Location()

 func getLocationData() {

    let titleRef = self.ref.childByAppendingPath("events")
    titleRef.observeSingleEventOfType(.Value, withBlock: { snapshot in

        var tempDict = [NSDictionary]()

        for item in snapshot.children {

            let child = item as! FDataSnapshot
            let dict = child.value as! NSDictionary
            tempDict.append(dict)
        }

        self.dictionaryOfRecommendations = tempDict

    })

    // Parse data from Firebase

    // Loop through each dictionary and assign values to location object
    var index:Int
    for index in 0...dictionaryOfRecommendations.count {

        // Current Json dictionary
        let jsonDictionary:NSDictionary = self.dictionaryOfRecommendations[index]

        self.currentlyConstructingLocation.title = jsonDictionary["title"] as! String!
        self.currentlyConstructingLocation.locationsLatitudeArray = jsonDictionary["latitude"] as! Double
        self.currentlyConstructingLocation.locationsLongitudeArray = jsonDictionary["longitude"] as! Double

        // Append to Locations Array and start new Location
        self.locationsArray.append(currentlyConstructingLocation)
        self.currentlyConstructingLocation = Location()

    }

    // Notify the MainViewController that the Locations are ready.
    ...
}

1 个答案:

答案 0 :(得分:1)

以上是基于Jay的有用指导的上述问题的更新正确代码:

//下载事件位置数据的模型。

//Firebase reference
var ref = Firebase(url: "<MYFIREBASEURL")

var locationsArray:[Location] = [Location]()
var dictionaryOfRecommendations:[NSDictionary] = [NSDictionary]()
var currentlyConstructingLocation:Location = Location()

 func getLocationData() {

    let titleRef = self.ref.childByAppendingPath("events")
    titleRef.observeSingleEventOfType(.Value, withBlock: { snapshot in

        var tempDict = [NSDictionary]()

        for item in snapshot.children {

            let child = item as! FDataSnapshot
            let dict = child.value as! NSDictionary
            tempDict.append(dict)

        }

        self.dictionaryOfRecommendations = tempDict
        self.ParseFirebaseData()

    })
}

func ParseFirebaseData() {
    // Parse data from Firebase

    // Loop through each dictionary and assign values to location object
    var index:Int
    for index in 0...dictionaryOfRecommendations.count - 1 {

        // Current Json dictionary
        let jsonDictionary:NSDictionary = self.dictionaryOfRecommendations[index]

        self.currentlyConstructingLocation.title = jsonDictionary["title"] as! String!
        self.currentlyConstructingLocation.locationsLatitudeArray = jsonDictionary["latitude"] as! Double
        self.currentlyConstructingLocation.locationsLongitudeArray = jsonDictionary["longitude"] as! Double

        // Append to Locations Array and start new Location
        self.locationsArray.append(currentlyConstructingLocation)
        self.currentlyConstructingLocation = Location()

    }
}