整数不是用swift和firebase加1

时间:2018-04-04 09:49:49

标签: ios swift firebase firebase-realtime-database swift4

我在使用swift和firebase时遇到了一些麻烦。这是我的问题: 我想从我的firebase数据库中获取一个字符串。所以我把它转换成第5行的int。然后在下一个函数中我想要多次,其中一天是假的我想要获取didntPractiseInt变量并向其添加1。问题是它似乎没有在print语句中添加(在下一行)。

var didntPractiseInt = 0

self.practise?.ref?.observeSingleEvent(of: .value, with: { (snapshot) in
    let snapshot = snapshot.value as? NSDictionary
    let practised = snapshot?["didntPractiseCounter"] as? String ?? ""
    self.didntPractiseInt = Int(practised)!
})

day.ref?.observeSingleEvent(of: .value, with: { (snapshot) in
    let snapshot = snapshot.value as? NSDictionary
    let practised = snapshot?["practised"] as? String ?? ""
    if practised == "false" {
        self.didntPractiseInt += 1
        print(self.didntPractiseInt)
    }
})

// PRINTS 22222

关于print语句的有趣之处在于它打印了适量的false(s)但不是每次都添加它们。

感谢任何贡献者!

我的Firebase数据库:

enter image description here

1 个答案:

答案 0 :(得分:0)

第二次通话需要在我的评论第一次通话后发出。 Firebase已经是异步的,为确保按顺序发生事情,需要在Firebase关闭中对其进行处理。所以典型的模式是

addObserver {
   receive a valid snapshot {
      do something with snapshot data as it's only valid at this point
   }
}

此外,我们可以在Swift中完全执行此操作,因为您知道节点名称是什么,所以可以直接访问它们而不是通过NSDictionary。我还包括基本错误检查以捕获nil节点。

var didntPractiseInt = 0

func checkDidntPracticeCount() {
    let whichNodeRef = self.ref.child("practice").child("some_node")
    let didntPracticeCounterRef = whichNodeRef.child("didntPracticeCounter")

    didntPracticeCounterRef.observeSingleEvent(of: .value, with: { snapshot in
        if let didntPracticeCount = Int(snapshot.value as! String) {
            self.didntPractiseInt = didntPracticeCount
            self.checkDidPracticeOnADay()
        } else {
            print("didntPracticeCounter node not found")
        }
    })
}

func checkDidPracticeOnADay() {
    let whichNodeRef = self.ref.child("practice").child("some_node")
    let dayNum = "0"
    let whichDayRef = whichNodeRef.child("days").child(dayNum).child("practiced")
    whichDayRef.observeSingleEvent(of: .value, with: { snapshot in
        if let didPractice = snapshot.value as? String {
            if didPractice == "false" {
                self.didntPractiseInt += 1
                print(self.didntPractiseInt)
            } else {
                print("did practice on day \(dayNum)")
            }
        }
    })
}

请注意,self.ref指向我的Firebase作为类var。

我还建议使用布尔值而不是“false”和“true”,您可能需要考虑将计数器存储为Int而不是String,因为它们可能更容易用于排序等。

最后,数组在NoSQL数据库中可能是坏消息,它们的使用非常具有情境性。你可能想考虑以其他方式存储你的日子。在这种情况下可能没问题,但请查看Arrays Are Evil。它是2014年的帖子,但仍然非常适用。

修改: 我正在考虑这个,并且考虑到你的日子节点总会有7天,可能会有一个更简单的方法。我不知道这是否有帮助,但简单的查询将提供用户在给定的一周内练习的天数。

let daysRef = self.ref.child("practice").child("some_node").child("days")
let query = daysRef.queryOrdered(byChild: "practiced").queryEqual(toValue: "true")
query.observeSingleEvent(of: .value, with: { snapshot in
    print(snapshot.childrenCount)
})

如果是这种情况,那么我的答案第一部分中的所有代码都可以替换为此代码。