使用客户端阻止的用户上的swift过滤器从firebase字典中删除值

使用客户端阻止的用户上的swift过滤器从firebase字典中删除值,swift,firebase,firebase-realtime-database,Swift,Firebase,Firebase Realtime Database,我的数据库结构是这样的 "blockByUser" : { "pcAkkvLY1TYseqk04sISUqop3Wt1" : { "7OYw2AtvZ7hxprFiX2e1LOn1DWs2" : true, "W4uaW1pOtkYUMh1jTJJVXQu0u6f1" : true } } "users" : { "Gn0SwQOmUvNkAFeg0YpGax75cpz2" : { "blocked" : { "pcAkkvLY1TYs

我的数据库结构是这样的

 "blockByUser" : {
  "pcAkkvLY1TYseqk04sISUqop3Wt1" : {
    "7OYw2AtvZ7hxprFiX2e1LOn1DWs2" : true,
    "W4uaW1pOtkYUMh1jTJJVXQu0u6f1" : true
  }
 }

"users" : {
   "Gn0SwQOmUvNkAFeg0YpGax75cpz2" : {
     "blocked" : {
       "pcAkkvLY1TYseqk04sISUqop3Wt1" : true
     },
     "capacity" : "NO",
     "country" : "Netherlands",
     "email" : "katnl"
   },
   "iDlNUNNAsiN0JmO8bEdYAdANcn62" : {
     "blocked" : {
       "Gn0SwQOmUvNkAFeg0YpGax75cpz2" : true
     },
     "capacity" : "NO",
     "country" : "Netherlands",
     "email" : "dal"
   },
   "pcAkkvLY1TYseqk04sISUqop3Wt1" : {
     "capacity" : "NO",
     "country" : "Netherlands",
     "email" : "test",
   }
 }
我现在必须在客户端进行筛选,从blockedByUser中删除密钥,因此我有两个字典,一个是“完整”用户列表,另一个是blockedByUsers,现在我在更新collectionView时遇到问题,因为firebase数据是异步的,我不确定如何使其像这样工作:

func fetchBlockedUsers() {

        print("Fetching blocked users..")

        let ref = FIRDatabase.database().reference().child("blockedByUser").child(currentUserUID)
        ref.observe(.value, with: { (snapshot) in
            guard let dictionaries = snapshot.value as? [String: Any] else { return }

            self.users.removeAll()

            let blocked = dictionaries

            let ref = FIRDatabase.database().reference().child("users")
            ref.observeSingleEvent(of: .value, with: { (snapshot) in
                guard let dictionaries = snapshot.value as? [String: Any] else { return }

                var dict = dictionaries
                for block in blocked {
                    dict.removeValue(forKey: block.key)
                }


                dict.forEach({ (key, value) in
                    guard let userDictionary = value as? [String: Any] else { return }

                    let user = UserModel(uid: key, dictionary: userDictionary)
                    self.users.append(user)
                })

                self.collectionView?.reloadData()

            }) { (err) in
                print("Failed to fetch users for search:", err)
            }

        }) { (err) in
            print("Failed to fetch users for search:", err)
        }

    }

但也许最好将数据扇出并使用firebase函数来管理数据

这很难理解。你能澄清这个问题和你想做什么吗?一个用户有能力在应用程序中阻止另一个用户,因此苹果希望被阻止的用户不再出现在该用户的用户列表中。@Jay试图找到一个好的解决方案来阻止某个用户的用户,以及如何将其存储在Firebase中并与Firebase一起,为应用程序中的每个新用户复制每个用户是否更好?如果阻止该用户从该用户的用户列表中删除该用户?或者在客户端执行?这里的目标是显示用户列表;被阻止的不会显示,被阻止的用户知道哪些用户阻止了它们?也就是说,将有三份清单。1) 用户2)阻止用户3)阻止此用户的用户?我认为您有最简单的解决方案。在每个用户节点中,保留用户已阻止的用户列表。当用户登录到应用程序时,首先读取该列表(这样应用程序将知道被阻止的用户),当应用程序迭代现有用户以加载它们时(通过.childAdded),如果正在加载的用户与被阻止用户列表中的用户匹配,则不要将它们添加到用户数组中。您也可以通过代码中的.value来实现。