我在离线模式下启动app使用firebase,当我订阅某个节点的子值时,observe*(_:,withBlock:)
的回调没有触发(初始值和更改都没有)。订阅直接值(无子女)工作正常。看一下片段:
let database = FIRDatabase.database()
database.reference().keepSynced(true)
let databaseRef = database.reference()
database.goOffline()
databaseRef.child("user").setValue("user1")
let userKey = databaseRef.child("usr").childByAutoId().key
let userValues = ["uid": "uid",
"name" : "name",
"surname" : "surname"]
databaseRef.child("/usr/\(userKey)/").setValue(userValues)
//1
databaseRef.child("user").observeSingleEventOfType(.Value, withBlock:{ snap in
print("works")
})
//2
databaseRef.child("usr").observeSingleEventOfType(.Value, withBlock:{ snap in
print("doesnt work")
})
//3
databaseRef.child("usr/\(userKey)/uid").observeSingleEventOfType(.Value, withBlock:{ snap in
print("works")
})`
订阅1& 2工作正常,但订阅2赢了,直到至少一次数据库上线。从与远程数据库同步的那一刻起,i可以脱机,一切正常。有谁知道如何处理这个问题?
答案 0 :(得分:3)
当您的应用离线时,Firebase客户端将从其缓存中触发事件。如果您的应用从未连接到Firebase服务器,则此缓存将为空。
这意味着Firebase客户端不知道您请求的位置是否存在值。因此,它不会发生事件。
答案 1 :(得分:-1)
我遇到了类似的问题,但我使用了updateChildValues
的深层链接,这导致本地缓存不会在中间(/ path / intermediate / otherpath)键上触发事件。我发现的解决方法是在我传递给updateChildValues
的字典中更加冗长。 (我仍然认为这是Firebase SDK中的一个错误。)