Swift 4 Firebase:能否用相同AutoID向多位置上传帖子?
解决Firebase多位置帖子同步AutoID的问题
你遇到的问题根源在于每次调用childByAutoId()都会生成一个全新的唯一ID,所以三个位置的帖子自然对应不同的ID,导致删除时无法同步。其实只需要提前生成一个统一的AutoID,然后用这个ID去三个位置写入数据就可以了,具体步骤如下:
先生成全局唯一的帖子ID
我们可以先调用一次childByAutoId()来获取这个唯一ID,不用立刻写入数据,只需要取它的key值:// 先创建一个posts下的新引用,获取它的key作为统一ID let postRef = Database.database().reference().child("posts").childByAutoId() let postId = postRef.key!使用统一ID写入三个位置
接下来就用这个postId代替每次的childByAutoId(),直接在三个节点下创建对应ID的子节点并写入数据:// 上传至全局页面 Database.database().reference().child("posts").child(postId).setValue(postObject) // 上传至用户选择的指定国家页面(这里以Albania为例,实际可以用变量动态替换) Database.database().reference().child("AlbaniaPosts").child(postId).setValue(postObject) // 上传至用户UID对应的个人主页 Database.database().reference().child(uid!).child(postId).setValue(postObject)(可选)用批量写入保证原子性
为了避免出现部分位置写入成功、部分失败的情况,推荐使用Firebase的updateChildValues进行批量写入,这样操作要么全部成功,要么全部失败,数据一致性更好:// 构建批量更新的字典,键是各个节点的路径 let updates: [String: Any] = [ "/posts/\(postId)": postObject, "/AlbaniaPosts/\(postId)": postObject, "/\(uid!)/\(postId)": postObject ] // 执行批量写入 Database.database().reference().updateChildValues(updates)
这样处理后,三个位置的帖子就共用同一个postId了,之后你删除帖子时,只需要根据这个postId,同时删除三个节点下对应的子节点即可实现同步删除。
内容的提问来源于stack exchange,提问作者Jiyar
相关产品推荐
相关产品推荐

