【问题标题】:Firebase database doesn't stop updatingFirebase 数据库不会停止更新
【发布时间】:2019-08-29 15:59:57
【问题描述】:

我在尝试更新我的 Firebase 数据库时遇到了这个问题。看看下面的代码sn-p和截图:

func saveRetrieveStoryID(completion: @escaping (Bool) -> Void) {

    let userID = Auth.auth().currentUser?.uid
    //Create a reference to the database
    let DBRef = Database.database().reference()

    let storyIDRef = DBRef.child("Story IDs").child(userID!)
    storyIDRef.observe(.value) { (snapshot) in

        for childOne in snapshot.children {
            print(childOne)
            if let childOneSnapshot = childOne as? DataSnapshot {

                storyIDKeyList.append(Int(childOneSnapshot.key)!)
                print(childOneSnapshot.key)
                completion(true)
            }
        }
        print(storyIDKeyList)
    }
}

代码的作用是从数据库中检索密钥 (-1) 并将其存储在列表 (storyIDKeyList) 中。现在看看下面的代码sn-p:

saveRetrieveStoryID { (saved) in
    if saved {

        // Store the story ID in the user's story ID dict
        let storyIDRef = DBRef.child("Story IDs").child(userID!)
        let newStoryIDKey = storyIDKeyList.last! + 1

        storyIDs[String(newStoryIDKey)] = storyRef.key

        storyIDRef.updateChildValues(storyIDs, withCompletionBlock: { (error, ref) in
            if let error = error?.localizedDescription {
                print("Failed to update databse with error: ", error)
            }
        })
    }
}

这段代码从storyIDKeyList 中取出最后一项并将其加1。然后这将被添加到 storyIDs 字典 storyIDs[String(newStoryIDKey)] = storyRef.key 中,并且数据库将使用新的键和值进行更新。但问题是,数据库不断更新,直到我停止运行代码才停止。这是生成的数据库的图片:

请注意,所有值都是相同的。以下屏幕截图应该是预期的结果:

我只想在每次运行代码时向数据库添加一个键/值;我有点知道为什么会这样,但我发现很难解决这个问题。

【问题讨论】:

    标签: swift firebase firebase-realtime-database


    【解决方案1】:

    经过多次尝试,我设法找到了解决此问题的方法。

    编辑:我找到了更好的解决方案,感谢这个答案:Android Firebase Database keeps updating value。使用 observeSingleEvent() 只检索一次数据。

    这是代码(更好的答案 IMO):

    func saveRetrieveStoryID(completion: @escaping (Bool) -> Void) {
    
        let userID = Auth.auth().currentUser?.uid
    
        let storyIDRef = DBRef.child("Story IDs").child(userID!)
        storyIDRef.observeSingleEvent(of: .value) { (snapshot) in
    
            for childOne in snapshot.children {
    
                if let childOneSnapshot = childOne as? DataSnapshot {
                    storyIDKeyList.append(Int(childOneSnapshot.key)!)
                }
            }
            completion(true)
        }
    }
    

    旧答案(也适用):

    func saveRetrieveStoryID(completion: @escaping (Bool) -> Void) {
    
        let userID = Auth.auth().currentUser?.uid
    
        let storyIDRef = DBRef.child("Story IDs").child(userID!)
        storyIDRef.observe(.value) { (snapshot) in
    
            for childOne in snapshot.children {
    
                if let childOneSnapshot = childOne as? DataSnapshot {
                    storyIDKeyList.append(Int(childOneSnapshot.key)!)
                }
            }
            storyIDRef.removeAllObservers()
            completion(true)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-04
      • 1970-01-01
      相关资源
      最近更新 更多