Firebase在离线模式下启动,不会为子值启动osberve *

时间:2016-06-09 08:11:22

标签: ios firebase offline firebase-realtime-database

我在离线模式下启动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可以脱机,一切正常。有谁知道如何处理这个问题?

2 个答案:

答案 0 :(得分:3)

当您的应用离线时,Firebase客户端将从其缓存中触发事件。如果您的应用从未连接到Firebase服务器,则此缓存将为空。

这意味着Firebase客户端不知道您请求的位置是否存在值。因此,它不会发生事件。

答案 1 :(得分:-1)

我遇到了类似的问题,但我使用了updateChildValues的深层链接,这导致本地缓存不会在中间(/ path / intermediate / otherpath)键上触发事件。我发现的解决方法是在我传递给updateChildValues的字典中更加冗长。 (我仍然认为这是Firebase SDK中的一个错误。)

请参阅this Stack Overflow question