gpt4 book ai didi

swift - 再次点击按钮如何反转事务,使事务的读写不增加?

转载 作者:行者123 更新时间:2023-11-28 13:24:54 24 4
gpt4 key购买 nike

我正在使用以下代码在点击或单击按钮时在 firestore 数据库中运行事务。如果条件已经为真并且再次点击相同的按钮,我该如何反转交易以使交易的读写次数减少而不是进一步增加?这就像我们喜欢 Instagram 帖子,如果再次点击心型按钮,我们会删除 Instagram 帖子上的赞。

 db.runTransaction({ (transaction, errorPointer) -> Any? in
let sfDocument: DocumentSnapshot
do {
try sfDocument = transaction.getDocument(likesRef)

} catch let fetchError as NSError {
errorPointer?.pointee = fetchError
return nil
}

guard let l1 = sfDocument.data()?["like"] as? Bool else {
let error = NSError(
domain: "AppErrorDomain",
code: -1,
userInfo: [
NSLocalizedDescriptionKey: "Unable to retrieve population from snapshot \(sfDocument)"
]
)
errorPointer?.pointee = error
return nil
}

// Note: this could be done without a transaction
// by updating the population using FieldValue.increment()
// let l11 = false
guard l1 == false else {
let error = NSError(
domain: "AppErrorDomain",
code: -2,
userInfo: [NSLocalizedDescriptionKey: "Population \(l1) too big"]
)
errorPointer?.pointee = error
return nil
}

transaction.updateData(["like": true], forDocument: likesRef)
self.createMessageRoom()
return l1
})

最佳答案

Cloud Firestore 中没有“反向事务”的概念(在我使用过的其他数据库中也没有)。如果您有两个互为逆向的不同操作,则您要么必须实现两个事务,要么找到一种方法将“反向”转换为单个代码块中的参数。

后者实际上在您的场景中似乎很常见,您使用单个事务执行以下步骤:

  1. 读取包含likes的文档的当前值
  2. 如果文档包含当前用户喜欢的内容,请将其删除。
  3. 如果文档不包含当前用户喜欢的内容,请添加它。

例如,如果我们将“已经喜欢”建模为 true 并将“然后不喜欢”建模为false`,您可以执行以下操作:

let newLikeValue true
guard l1 == true else {
newLikeValue = false
}

transaction.updateData(["like": newLikeValue], forDocument: likesRef)

关于swift - 再次点击按钮如何反转事务,使事务的读写不增加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58539914/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com