【问题标题】:(Swift) Firebase keepSynced(true) does not work(Swift) Firebase keepSynced(true) 不起作用
【发布时间】:2018-02-07 06:58:41
【问题描述】:

在我的 Swift 项目中,我实现了 Firebase 并为我的主 tableView 定义了一个结构。在我的主 TableView 上,我有想要更新并与 firebase 同步的值。 firebase 文档提供了以下代码:

let scoresRef = Database.database().reference(withPath: "scores") scoresRef.keepSynced(true) 我曾尝试在 viewDidLoad、fetchFunction 和 AppDelegate 上使用 keepSynced 函数,但显然只有当我切换到另一个 viewController 并返回到我的 mainTableView 时,这些值才会更新。

下面我将演示我的代码:

将 firebase 提取到我的 TableView 的函数(包含在 ViewDidLoad 中)和 Bar 是我的结构模型:

    func fetchBars(){
    let myRef = ref.child("paris")
    myRef.keepSynced(true)
    myRef.observe(.childAdded, with: { (snapshot) in
        guard let bar = Bar.bar(from: snapshot) else {return}
        self.bars.append(bar)
        self.tableView.reloadData()
    })
}

请帮助我解决这个问题,如果可能,请展示示例。

【问题讨论】:

  • 你分享的代码有什么问题?它有什么作用?你期望它做什么?
  • @FrankvanPuffelen 代码基本上从 Firebase 获取所有值并将其显示在表格视图中。例如,每个条都将其所有值分配给一个单元格。在那个单元格中,我有不同类型的信息,包括酒吧现在是开放还是关闭。所以我希望这些信息保持新鲜。
  • 您在myRef.observe(.childAdded 添加的代码将立即为每个孩子触发,然后在添加孩子时立即触发。不是这样吗?
  • @FrankvanPuffelen 是的。但我也想保持现有的儿童数据新鲜。对我的代码有什么建议吗?
  • 正如@FrankvanPuffelen 提到的,此代码只会通知您的应用程序 .childAdded 事件。如果您想保持其他数据同步,您还需要包括观察 .childChanged 和 .childRemoved 事件。请参阅“侦听子事件”部分中的 Working With Lists of Data。即添加: myRef.observe(.childChanged... 和 myRef.observe(.childRemoved...

标签: ios swift uitableview firebase firebase-realtime-database


【解决方案1】:

我之前被这个问题困扰了很长时间。我几乎失去了希望,并认为这确实是与 Firebase 相关的问题。

您正在检索缓存数据而不是更新的服务器数据的原因很可能是因为您在 Firebase 控制台中设置的安全规则(或您在没有!)。只需在 myRef 设置正确的规则,允许从该数据库引用中读取(类似于 ".read" = true 的内容),您就可以开始了!

请注意".read" = true 允许任何人 读取此引用处的数据。如果这不是所需的行为,那么您应该在方便时更改安全规则。只要您的 iOS 应用程序根据您设置的规则允许读取,那么keepSynced(_:) 方法将更新数据而不是检索缓存的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 2016-10-22
    • 1970-01-01
    相关资源
    最近更新 更多