Ios 使用相同的UploadKey同步保存来自POST的数据

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

我正在开发一个应用程序,你可以发布不同类别的图片。 例如:动物/摩托车

我的用户可以跟踪用户并查看他们的图片

现在我正在做以下工作:我想上传一个类别中的帖子,同时在所有帖子中添加一个单独的屏幕,用户可以在其中随机看到所有发布的图片

每个帖子,无论张贴在哪里,都将位于allPosts子项中

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)")
    }
})