【问题标题】:Firebase Value Not Incrementing with Swift?Firebase 值不随 Swift 增加?
【发布时间】:2016-03-21 00:58:13
【问题描述】:

我正在创建前 10 名列表。我需要某些项目的值具有一个值,并且每次有人同意时该值都会增加。它目前没有更新,而是尝试添加相同的值并立即消失。这是我的 Firebase 堆栈....

TopVideos-->
 yWfsla_Uh80-->
   Value: 1
   description: "Download on iTunes : KOR https://itunes.apple.c..."
   imageString: "https://i.ytimg.com/vi/yWfsla_Uh80/default.jpg"
   rank: 1
   title: "EXO_CALL ME BABY_Music Video"
   user: "6ef370d4-a1bd-48ce-9ae0-93d2e20f3bc8"
   videoID: "yWfsla_Uh80"

我想增加“价值”子/节点,但它没有发生。这是我的代码....

topVideoRef.childByAppendingPath("Value").runTransactionBlock({
                (currentData:FMutableData!) in
                var value = currentData.value as? Int
                if value == nil  {
                    value = 0
                }
                currentData.value = value! + 1
                return FTransactionResult.successWithValue(currentData)
            })

我完全按照 Firebase 指南进行操作,但我可能遗漏了一些东西。顺便说一句...如果您知道答案,请包括如何减少值。谢谢。

* 更新 *

我正在像这样创建 videoRef .....

vidRank = Int(self.rankValue.text!)!
let vidArray = ["user" : self.ref.authData.uid, "videoID": self.videoId, "rank": self.vidRank, "title": self.vidTitleText, "description": self.vidDescription, "imageString": self.vidIMG]
let topVideoRef = self.ref.childByAppendingPath("TopVideos/\(self.videoId)")
topVideoRef.setValue(vidArray)

【问题讨论】:

  • 你能展示一下你是如何创建topVideoRef的吗?
  • @DavidEast 我已经更新了帖子。我也试过value!++currentData.value.updateChildValues。虽然我可能写错了。
  • 成功回调有什么要说的?有错误吗?是承诺了吗?你是如何确定它不成功的?数据库中的当前值是多少?什么是认证状态?有哪些安全规则?见how to askcreating an mcve

标签: database swift firebase increment


【解决方案1】:

我修改了代码,将字段替换为文本,然后创建了两个函数,链接到窗口上的两个按钮

然后运行代码,它似乎可以工作。

func clickedButton1() {

    print("Button1Action")

    let myRootRef = Firebase(url:"https://your-app.firebaseio.com")

    let vidArray = ["user" : "some user id",
        "videoID": "some video id",
        "rank": "some rank",
        "title": "a title",
        "description": "a description",
        "imageString": "an image"]


    let topVideoRef = myRootRef.childByAppendingPath("TopVideos/\("vid_id_0")")
    topVideoRef.setValue(vidArray)

}

还有第二个功能

func clickedButton2() {

    print("Button2Action")

    let myRootRef = Firebase(url:"https://your-app.firebaseio.com")

    let topVideoRef = myRootRef.childByAppendingPath("TopVideos/\("vid_id_0")")

    topVideoRef.childByAppendingPath("Value").runTransactionBlock({
        (currentData:FMutableData!) in
        var value = currentData.value as? Int
        if value == nil  {
            value = 0
        }
        currentData.value = value! + 1
        return FTransactionResult.successWithValue(currentData)
    })

}

当按钮1被点击时,初始数据被写出。

每次单击按钮 2 时,Value 节点都会增加 1。

我猜你要么在某个时候覆盖了整个节点,要么有一个附加到 Value 的 onDisconnect 在你退出应用程序时将其删除。

或者...它被设置为 nil,这将导致您所看到的。它会有一个值然后突然消失。

【讨论】:

  • 请查看我的解决方案并评论代码的有效性。
【解决方案2】:

感谢@Jay 的回答。它对 Firebase Data 有了更深入的了解;检索和存储。我被困了一段时间,因为我让我的按钮添加然后更新,但它陷入了一个连续的循环。一旦我使用了observeSingleEventofType,它就融合在一起了。这是我完成的代码,我最初为用户保存视频,然后检查视频是否为 #1 视频并从那里保存或更新...

  @IBAction func finalSaveBTN(sender: AnyObject)
    {
        vidRank = Int(self.rankValue.text!)!
        let vidArray = ["user" : self.ref.authData.uid, "videoID": self.videoId, "rank": self.vidRank, "title": self.vidTitleText, "description": self.vidDescription, "imageString": self.vidIMG]
        let videoRef = self.ref.childByAppendingPath("UserVideo/\(self.ref.authData.uid)/Vid\(vidRank)")
        videoRef.setValue(vidArray)

        if self.vidRank == 1
        {
            let findTopRef = self.ref.childByAppendingPath("TopVideos/\(self.videoId)")
            findTopRef.queryLimitedToFirst(1)
                .observeSingleEventOfType(.Value, withBlock: { snapshot in
                    if snapshot.value is NSNull
                    {
                        print("Save")
                        self.clickedButton1()
                    }
                    else
                    {
                        print("Updated")
                        self.clickedButton2()
                    }
                })
        }
    }

    func clickedButton1()
    {
        print("Button1Action")
        let vidArray = ["Value" : 1, "videoID": self.videoId, "title": self.vidTitleText, "description": self.vidDescription, "imageString": self.vidIMG]
        let topVideoRef = self.ref.childByAppendingPath("TopVideos/\(self.videoId)")
        topVideoRef.setValue(vidArray)
    }

    func clickedButton2()
    {
        print("Button2Action")
        let topVideoRef = self.ref.childByAppendingPath("TopVideos/\(self.videoId)")
        topVideoRef.childByAppendingPath("Value").runTransactionBlock({
            (currentData:FMutableData!) in
            var value = currentData.value as? Int
            if value == nil  {
                value = 0
            }
            currentData.value = value! + 1
            return FTransactionResult.successWithValue(currentData)
        })
    }

如果有问题,请发表评论。顺便说一句,如果 #1 Vid 已经存在,我仍然需要降低价值。

【讨论】:

  • 如果我的回答对您有帮助,请接受 :-) 此外,您可能只想通过解决方案向您的问题添加其他信息,而不是回答您自己的问题。
猜你喜欢
  • 2020-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-05
  • 2019-08-08
  • 2017-07-05
  • 2020-08-28
相关资源
最近更新 更多