我正在尝试向我们的 iOS 应用程序(简单地说,一个管理用户和项目的应用程序)添加离线功能,该应用程序依赖于 Firebase。这是使用 Swift 3.0。我已按照指南进行操作并执行了以下操作:
-
在 FIRApp.configure() 之后将其添加到我的应用程序委托中:
FIRDatabase.database().persistenceEnabled = true
在 users/userKey 和所有所述用户的项目/projectKey 节点上调用 keepSynced(true) 。
该应用程序在在线时运行良好(显然),并且在离线时也同样运行良好,即使我在与互联网断开连接时重新启动它也是如此。当我在离线状态下创建新项目时,就会出现问题。我使用以下命令创建一个新项目:
let projectKey = FIRDatabase.database().reference(withPath: "projects").childByAutoId().key
let logsKey = FIRDatabase.database().reference(withPath: "projects").child(projectKey).child("logs").childByAutoId().key
FIRDatabase.database().reference().updateChildValues([
"projects/\(projectKey)/key1" : value1,
"projects/\(projectKey)/key2" : [
"subkey1" : subvalue1,
"subkey2" : subvalue2
],
"projects/\(projectKey)/key3/\(logKey)" : [
"subkey3" : subvalue3,
"subkey4" : subvalue4
]
]) { error, ref in
if error != nil {
print("Error")
return
}
}
项目创建后,如果我尝试在“projects/projectKey/key1”或“projects/projectKey/key2”上调用observeSingleEvent,一切都很好。但是,在“projects/projectKey/key3/logKey”上调用相同的函数永远不会触发块/回调 - 只有在连接恢复时才会调用它。
我已启用 FIRDatabase 日志记录(确认发生本地写入)来查找提示,但似乎无法找出问题。
我有什么遗漏的吗?
注意:使用最新的 Firebase iOS SDK (3.5.2)。
编辑:如果我扩展深层链接,它似乎工作正常:
let projectKey = FIRDatabase.database().reference(withPath: "projects").childByAutoId().key
let logsKey = FIRDatabase.database().reference(withPath: "projects").child(projectKey).child("logs").childByAutoId().key
FIRDatabase.database().reference().updateChildValues([
"projects/\(projectKey)" : [
"key1" : value1,
"key2" : [
"subkey1" : subvalue1,
"subkey2" : subvalue2
],
"key3" : [
logKey : [
"subkey3" : subvalue3,
"subkey4" : subvalue4
]
]
]
]) { error, ref in
if error != nil {
print("Error")
return
}
}
这可能是 Firebase 离线时管理其本地缓存状态的方式中的错误吗?就好像它不知道使用 updateChildValues 中的深层链接创建的中间键一样。