所以我使用此功能来控制我的应用中的参加和不参加活动的功能。我的firebase数据库包含每个事件的参与计数。我还使用事务块来促进多次单击该按钮的任务,并确保数据计数在发生时不会被破坏。
以下是我尝试更改数据库以确保有人参加活动时使用的功能。
static func create(for event: Event?, success: @escaping (Bool) -> Void) {
// 1
guard let key = event?.key else {
return success(false)
}
guard let uid = Auth.auth().currentUser?.uid else{
return
}
let attendData = ["Attending/\(key)/\(uid)" : true,
"users/\(uid)/\("Attending")/\(key)" : true]
// 2
let ref = Database.database().reference()
ref.updateChildValues(attendData) { (error, _) in
if let error = error {
assertionFailure(error.localizedDescription)
return success(false)
}
// 3
//return success(true)
let attendCountRef = Database.database().reference().child("events").child(key).child("attend:count")
attendCountRef.runTransactionBlock({ (mutableData) -> TransactionResult in
let currentCount = mutableData.value as? Int ?? 0
print(mutableData.value)
print(currentCount)
mutableData.value = currentCount + 1
return TransactionResult.success(withValue: mutableData)
}, andCompletionBlock: { (error, _, _) in
if let error = error {
assertionFailure(error.localizedDescription)
success(false)
} else {
success(true)
}
})
}
}
这是我的数据库结构样本
"events" : {
"ABP" : {
"attend:count" : 2,
"event:category" : "Seize The Night",
"event:city" : "Philadelphia",
"event:date" : {
"end:date" : "08/09/2017",
"end:time" : "7:00 PM",
"start:date" : "08/10/2017",
"start:time" : "12:00 PM"
}
}
似乎是交易阻止。它没有抓住参加人数。它返回零而不是2.在数据库端没有正确地改变它。任何帮助表示赞赏