Ios 使用相同的UploadKey同步保存来自POST的数据
我正在开发一个应用程序,你可以发布不同类别的图片。 例如:动物/摩托车 我的用户可以跟踪用户并查看他们的图片 现在我正在做以下工作:我想上传一个类别中的帖子,同时在所有帖子中添加一个单独的屏幕,用户可以在其中随机看到所有发布的图片 每个帖子,无论张贴在哪里,都将位于allPosts子项中Ios 使用相同的UploadKey同步保存来自POST的数据,ios,swift,firebase,firebase-realtime-database,Ios,Swift,Firebase,Firebase Realtime Database,我正在开发一个应用程序,你可以发布不同类别的图片。 例如:动物/摩托车 我的用户可以跟踪用户并查看他们的图片 现在我正在做以下工作:我想上传一个类别中的帖子,同时在所有帖子中添加一个单独的屏幕,用户可以在其中随机看到所有发布的图片 每个帖子,无论张贴在哪里,都将位于allPosts子项中 var REF_POST = Database.database().reference().child("posts") 对于每个类别,都有一个特定的子类别,其中只有来自该类别的帖子 var REF_POS
var REF_POST = Database.database().reference().child("posts")
对于每个类别,都有一个特定的子类别,其中只有来自该类别的帖子
var REF_POST = Database.database().reference().child("motorcycles")
现在,在提要中,您可以毫无问题地喜欢和评论。
它使用来自子allPosts的数据
现在我想自动保持数据与摩托车中的post同步。它们都共享同一个密钥,但显然它只在allPosts子级中更新
目标是始终在AllPost和reverse的数据上更新每个类别。因此,如果用户喜欢该类别,它也将在所有帖子中更新
更新代码
func incrementLikesFeed(postId: String, onSuccess: @escaping (Post) -> Void, onError: @escaping (_ errorMessage: String?) -> Void){
let postRef = API.Post.REF_POSTS.child(postId)
postRef.runTransactionBlock({ (currentData: MutableData) -> TransactionResult in
if var post = currentData.value as? [String : AnyObject], let uid = API.User.CURRENT_USER?.uid {
var likes: Dictionary<String, Bool>
likes = post["likes"] as? [String : Bool] ?? [:]
var likeCount = post["likeCount"] as? Int ?? 0
var score = post["score"] as? Int ?? 0
if let _ = likes[uid] {
likeCount -= 1
score -= 100
likes.removeValue(forKey: uid)
self.REF_LIKES_POSTS.child(postId).child(uid).removeValue()
} else {
likeCount += 1
score += 100
likes[uid] = true
self.REF_LIKES_POSTS.child(postId).child(uid).setValue(true)
}
post["score"] = score as AnyObject?
post["likeCount"] = likeCount as AnyObject?
post["likes"] = likes as AnyObject?
currentData.value = post
return TransactionResult.success(withValue: currentData)
}
return TransactionResult.success(withValue: currentData)
}) { (error, committed, snapshot) in
if let error = error {
print(error.localizedDescription)
onError(error.localizedDescription)
}
if let dict = snapshot?.value as? [String: Any] {
let post = Post.transformPost(dict: dict, key: snapshot!.key)
onSuccess(post)
}
}
}
我如何才能实现只有特定的子对象得到更新
因为以后我会这样做
database.database().reference.child("Text").child("Sport")
database.database().reference.child("Text").child("Animals")
database.database().reference.child("Pictures").child("funnyPictures")
database.database().reference.child("Pictures").child("sweetAnimals")
我想让它检查所有帖子的整个数据库,看看哪个孩子包含相同的帖子ID。
当我有10个以上的类别时,我必须在一个类别中调用10个函数,并且它可能总是更新所有内容,而不仅仅是相同id的一篇文章
更新
let newUserData = ["score": score, "likeCount": likeCount, "likes": likes] as [String : Any]
let postRefEinzeiler = self.REF_EINZEILER.child(postId)
postRefEinzeiler.updateChildValues(newUserData)
let postRefSchwHumor = self.REF_SCHWARZERHUMOR.child(postId)
postRefSchwHumor.updateChildValues(newUserData)
有了这个代码片段,我成功地实现了我想要做的事情。
但是,它总是使用我提供的数据在其他类别中添加一个带有posted的节点
我如何才能让它首先查看postId是否已经存在,并且仅当它存在时才更新该值 这被称为客户端扇出,并在本文中介绍:。每一个代码片段都是Swift代码。问题是我将有大约20个类别展开到20个类别是一个相当简单的操作,您可以轻松地在客户端完成。你认为博客文章中的方法和代码有什么问题?老实说,我真的不知道如何将其应用到我的情况中。我成功地做到了,但我想没有那么优雅。你能看一下我最新的问题吗?非常感谢。我将有20个类别,有没有一种方法可以在数据库中搜索完全相同的键?
var BASE_POST = Database.database().reference()
// Generate a new push ID for the new post
let postkey = ENTER YOUR POST_ID
let postData = YOUR_POST_DETAILS_DICTIONARY
// Create the data we want to update
let updatedPostData = ["posts/\(postkey)": postData,
"motorcycles/\(postkey)": postData ]
// Do a deep-path update
ref.updateChildValues(updatedPostData, withCompletionBlock: { (error, ref) -> Void in
if (error) {
print("Error updating data: \(error.description)")
}
})
var BASE_POST = Database.database().reference()
// Generate a new push ID for the new post
let postkey = ENTER YOUR POST_ID
let postData = YOUR_POST_DETAILS_DICTIONARY
// Create the data we want to update
let updatedPostData = ["posts/\(postkey)": postData,
"motorcycles/\(postkey)": postData ]
// Do a deep-path update
ref.updateChildValues(updatedPostData, withCompletionBlock: { (error, ref) -> Void in
if (error) {
print("Error updating data: \(error.description)")
}
})