【问题标题】:How to properly add data from Firebase into Array?如何正确地将 Firebase 中的数据添加到数组中?
【发布时间】:2016-07-10 18:11:30
【问题描述】:

我正在尝试从 Firebase 获取结果并将它们放入 Array,但似乎我错过了一些东西。我想要的是从 Firebase 获取“时间”和“血糖”值并将它们放入我将用于图表的数组中。我能够将数据放入“BG”和“时间”数组中,但是当我将它们“附加”到“FetchedDate”和“FetchedBG”中时,我看到了空数组(FetchedBG 和 FetchedDate)

var FetchedDate:[String]! = []
var FetchedBG: [Double]! = []

//GET DATA FROM FB 
func GetDetails(){
    let posts = rootRef.child("Diary/\(userID!)/\(passedDATE!)")
    //let posts = rootRef.queryOrderedByChild(passedDATE!)
    posts.observeEventType(FIRDataEventType.Value , withBlock: { (snapshot) in

        for list in snapshot.children {
            if  let BG = list.value.objectForKey("Blood Glucose")!.doubleValue {
            self.FetchedBG.append(BG)
                print(BG) // SHOWS RESULTS AS EXPECTED
            }
            if let TIME = list.value.objectForKey("Time") {
            self.FetchedDate.append(TIME as! String)
                  print(TIME) // SHOWS RESULTS AS EXPECTED
            }
        }
    })  { (error) in
        print(error.localizedDescription)
    }
}

override func viewDidLoad() {
    super.viewDidLoad()

    GetDetails()

    print(FetchedDate) // EMPTY ARRAY 
    print(FetchedBG) // EMPTY ARRAY 

【问题讨论】:

    标签: arrays swift firebase firebase-realtime-database


    【解决方案1】:

    Firebase 异步加载(并同步)数据库中的数据。由于这可能需要一些时间,因此您的代码将继续执行并在数组仍然为空时打印数组。

    一旦有值可用(第一次或数据更改时),就会调用您的块。它将数据添加到数组中。但是到那时你的打印语句早就完成了。

    解决方案是将需要在值可用时(或已更改时)运行的代码移入块中。例如

    var FetchedDate:[String]! = []
    var FetchedBG: [Double]! = []
    
    //GET DATA FROM FB 
    func StartSynchronizingDetails(){
        let posts = rootRef.child("Diary/\(userID!)/\(passedDATE!)")
        //let posts = rootRef.queryOrderedByChild(passedDATE!)
        posts.observeEventType(FIRDataEventType.Value , withBlock: { (snapshot) in
    
            for list in snapshot.children {
                if  let BG = list.value.objectForKey("Blood Glucose")!.doubleValue {
                self.FetchedBG.append(BG)
                    print(BG) // SHOWS RESULTS AS EXPECTED
                }
                if let TIME = list.value.objectForKey("Time") {
                self.FetchedDate.append(TIME as! String)
                      print(TIME) // SHOWS RESULTS AS EXPECTED
                }
            }
            print(FetchedDate)
            print(FetchedBG)
        })  { (error) in
            print(error.localizedDescription)
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
        StartSynchronizingDetails()
    

    当您的应用与(可能很耗时)网络资源交互时,这是一种非常常见的模式。这也正是 Firebase 的 observeEventType 采用 withBlock: 参数的原因:将开始同步的代码与响应值更新的代码隔离开来。

    【讨论】:

    • 非常感谢!现在我可以把数据放到图表中了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    相关资源
    最近更新 更多