【问题标题】:Append Firebase data to an array in Swift将 Firebase 数据附加到 Swift 中的数组
【发布时间】:2016-08-22 01:06:51
【问题描述】:

我不知道我做错了什么!我只是想从 F​​irebase 数据库中获取数据并对每个结果进行迭代并将它们放入一个数组中。我尝试了多种不同的方法。但它们都返回结果,一次将一个添加到数组中。导致数组看起来像这样:

["1"]
["1","2"]
["1","2","3"]
["1","2","3","4"]

如您所见,它每次迭代都会添加一个对象。 这是我所拥有的:

let ref = FIRDatabase.database().reference().child("users")
ref.observeEventType(.ChildAdded, withBlock: { snapshot in
    userUrl = snapshot.value?["profile_image_1"] as! String
    imageArray.insert(userUrl, atIndex: 0)
}, withCancelBlock: { error in
    print(error.description)
}) 

我也试过这个:

let userUrl = (snapshot.value.objectForKey("profile_image_1")) as! String
imageArray.append(userUrl)

我只想将每个结果放入一个数组中,我可以在完成块之外一次访问数据。

["1","2","3","4"]

任何帮助都会很棒!

数据库: Firebase Database Structure

【问题讨论】:

    标签: arrays swift firebase firebase-realtime-database


    【解决方案1】:

    试试这样的:

    var imageArray = []
    
    func appendData(){
        let ref = FIRDatabase.database().reference().child("users") 
    
        ref.observeEventType(.Value, withBlock: { snapshot in
            var tempImageArray = []
    
            for user in snapshot.children {
                userUrl = user.value?["profile_image_1"] as? String
                self.imageArray.insert(userUrl, atIndex: 0)
                tempImageArray.append(broadcastItem)
            }
    
            self.imageArray = tempImageArray
        })
    }
    

    编辑:我更新了代码,请试试这个。

    【讨论】:

    • 这是我得到的:致命错误:在展开可选值时意外发现 nil let userUrl = snapshot.value?["profile_image_1"] as! String
    • 您能在 Firebase 中添加您的数据库结构的屏幕截图吗?此错误似乎“profile_image_1”不返回字符串,但根据您的结构,它可以很容易修复。
    • 我在我的问题中添加了我的数据库图像。
    • 更改为!字符串作为?字符串,看看是否会解决它。可能不是所有用户都有 profile_image_1。
    • 做到了!谢谢你的帮助乔迪。
    【解决方案2】:

    这并不能直接回答问题,但我假设您想在附加所有内容后访问最终数据。

    我遇到了同样的问题,我通过做与您正在做的完全相同的事情来解决它,然后我在完成块内创建了一个 dispatchQueue。

    let ref = FIRDatabase.database().reference().child("users")
    
    ref.observeEventType(.ChildAdded, withBlock: { snapshot in
        userUrl = snapshot.value?["profile_image_1"] as! String
        imageArray.insert(userUrl, atIndex: 0)
    
     DispatchQueue.main.async(execute: {
    
     //access the final array here.
    
      }
    }) 
    

    我希望这会有所帮助。

    【讨论】:

    • 此代码将不起作用,因为您仍在访问由 Firebase 的单个观察触发的观察块内的数组。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 2015-06-14
    • 1970-01-01
    相关资源
    最近更新 更多