Swift 从 Firebase 检索数据

Posted

技术标签:

【中文标题】Swift 从 Firebase 检索数据【英文标题】:Swift retrieve data from Firebase 【发布时间】:2017-08-11 22:05:15 【问题描述】:

我已经尝试过从 firebase(数据库)检索数据的不同尝试,但遗憾的是没有运气:我...所以我想知道这是否是正确的做法?

let dBRef = Database.database().reference()
         dBRef.child("Users").child("Advertisements").queryOrderedByKey().observe(.childAdded, with:  (snapshot) in

    let snapshotValue = snapshot.value as? NSDictionary

        let imageAd = snapshotValue?["imageAd"] as? String
        let priceAd = snapshotValue?["priceAd"] as? String

我不确定我是否真的收到了数据,我也不确定如何测试它...我尝试过调试但没有运气... 所以我的问题是,我的代码做错了吗?如果没有,我该如何检查我是否真的收到了数据??

【问题讨论】:

【参考方案1】:

您正在观察childAdded 事件。

所以你的闭包只会在我插入Users/Advertisements新值时执行。

试试这个代码

Database
    .database()
    .reference()
    .child("Users")
    .child(Auth.auth().currentUser!.uid)
    .child("Advertisements")
    .queryOrderedByKey()
    .observeSingleEvent(of: .value, with:  snapshot in

        guard let dict = snapshot.value as? [String:Any] else 
            print("Error")
            return
        
        let imageAd = dict["imageAd"] as? String
        let priceAd = dict["priceAd"] as? String
    )

闭包将只执行一次,并且“几乎”立即执行。

【讨论】:

所以我不需要这样做? dBRef.child("Users/(Auth.auth().currentUser!.uid)/advert‌​isements") 所以错误不是缺少 uid 部分?? @StrawHat 是的,您还需要添加用户 ID。请查看我的更新答案。 干杯,但我如何能够测试并查看我是否曾经从数据库中检索到当前可用数据?我没有办法真正测试这个?我对你看到的这个不太熟悉..【参考方案2】:

要测试您的数据是否准确提取,您可以在代码下方添加:print(imageAd)。假设这段代码在viewDidLoad 中,那么当视图控制器出现时它将显示在控制台中。

另外,我相信.queryOrderedByKey(...) 现在是.queryOrdered(byKey:...)

请记住,.observe() 本质上打开了与您的 Firebase 的连接。如果您希望实时、实时的连接保持打开状态并侦听数据更新,这是有道理的。如果您只需要一次数据,则在加载某些内容时,请考虑改用.observeSingleEventOf()。如果您打算使用 .observe() ,您还应该在需要关闭连接时使用 .removeAllObservers() 关闭连接。

您似乎只是想添加您之前在数据库中设置的信息。我会这样做 - (请记住,您在 json 中缺少 uid 步骤。我假设它是下面代码中的当前用户,但如果它是静态用户,则需要将其定义为字符串):

let uid = Auth.auth().currentUser?.uid 
dBRef.child(Users).child(uid).child(Advertisements).observeSingleEvent(of: 
   .value, with:  (snapshot) in

  let value = snapshot.value as? NSDictionary
  let imageAd = value?["imageAd"] as? String ?? ""
  let priceAd = value?["priceAd"] as? String ?? ""

  print("imageAd: \(imageAd!)")
  print("priceAd: \priceAd!)")`
  )

【讨论】:

我明白了,但我的目标是将一组数据列出到 tableView 中,这就是为什么我不使用 obserSingeEvent... /跨度> 这最初会显示您正在通过 print 语句获取数据。你能澄清一下你打算在表格视图中呈现什么吗? 您可以使用单个事件并用它填充表格视图。不同之处在于,例如,如果您有其他用户正在输入数据,而当前用户正在查看并且您希望实时更新数据。观察类似于站在外面观察事情的发生。单一事件是走出去,拍摄那一刻的一切。之后您对数据的处理与此无关。 好吧!,现在数据库被支撑着,我保存我拍摄的图像并将其作为 URL(字符串)推送到数据库(从另一个 ViewController)......所以在我尝试之前转换东西并将真实图像转换为 UIImageView ...我只想查看 UITableView 内部的 URL ...只是为了确保我检索数据并且可以将其设置为 labelTextField ...目前正在苦苦挣扎 运行此代码时是否在控制台中打印了一些内容?此代码应回答您在上面提出的问题。如果您的问题现在是另一个问题,您可能想问另一个问题。【参考方案3】:

我可以看到一个问题是你的路径是错误的。尝试类似:

let dBRef = Database.database().reference()    
dBRef.child("Users/\(FirAuth.auth.currentUser.uid)/advertisements")

dbRef.queryOrderedByKey().observe(.childAdded, with:  (snapshot) in

【讨论】:

您能否详细说明为什么我的坐姿不对?谢谢 FirAuth.auth.currentUser.uid 错了吗?它说它不存在.. 当然,我的意思是,在您的数据库参考中,您正在执行“users/advertisement/”,但您的参考应该是“users/userid/advertisements”,您正在跳过用户标识 啊,应该是这样的; dBRef.child("Users/(Auth.auth().currentUser!.uid)/advertisements") .. 我刚刚更改了它,但似乎什么也没发生,有没有办法测试我是否真的收到数据?调试变量或尝试其他方法?? 是的,但我将不得不查看更多代码或随时将您的项目发送给我。我不知道您要在哪里检索或显示数据(试图弄清楚您要做什么)【参考方案4】:

我遇到了和你一样的问题,但是通过查看 firebase Doc,你可以了解如何轻松检索数据。

lazy var databaseRef = Database.database().reference().child(yourpath).("Advertisements")

ref.observeSingleEvent(of: .value, with:  (snapshot) in

            let postDict = snapshot.value as? [String : AnyObject] ?? [:]

            if let email = postDict["Email"] 
                print(email)

            



        )  (error) in
            print(error.localizedDescription)
        

【讨论】:

以上是关于Swift 从 Firebase 检索数据的主要内容,如果未能解决你的问题,请参考以下文章

Swift 从 Firebase 检索数据

从 Firebase 检索和读取数据作为 NSArray (Swift 3)

从firebase实时数据库IOS Swift中检索数据

如何使用 Swift 中的 url 从 firebase 正确检索数据?

从 Firebase 检索数据等于意外 nil - swift

从 Firebase Auto Id 中检索数据 - Firebase Swift