Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 正在更新Firebase中的子节点。为什么只更新一个引用而不同时更新两个引用?_Swift_Firebase_Firebase Realtime Database - Fatal编程技术网

Swift 正在更新Firebase中的子节点。为什么只更新一个引用而不同时更新两个引用?

Swift 正在更新Firebase中的子节点。为什么只更新一个引用而不同时更新两个引用?,swift,firebase,firebase-realtime-database,Swift,Firebase,Firebase Realtime Database,我的firebase数据库中有用户 Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false]) Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false]) 我正在尝试添加好友请求功能。当按下

我的firebase数据库中有用户

Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false]) 

Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false]) 
我正在尝试添加好友请求功能。当按下好友请求按钮时,我希望数据库中两个用户的好友列表都能相应地修改

Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false]) 
出于某种原因

Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false]) 
准确更新当前用户的好友列表。但是第一句话,

Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false]) 
Ref.child("users").child(userClickedOnId!).child("Friends").updateChildValues([currentUserUid : false]) 
不更新firebase数据库中已单击用户的好友列表

Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false]) 
我添加了打印语句,一次尝试一个语句。以Ref.开头的语句几乎相同,那么为什么只有第二条语句可以修改当前用户的好友列表

Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false]) 
 @IBAction func funcconnectRequestButtonDidTapped(_ sender: Any) {
        let currentUserUid = Auth.auth().currentUser?.uid
        let userClickedOnId = uid
        let Ref = Database.database().reference()

        Ref.child("users").child(userClickedOnId!).child("Friends").updateChildValues([currentUserUid : false])
        Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false])
}

您可以创建另一个节点friendRequests,在该节点中,您可能有键为userUIDs和data
senderUID1:datelong、senderUID2:datelong
的child,只需在应用程序dbref.child('friendRequests/')+userUID)中侦听即可.addChildEventListener,您将获得所有已存在的好友请求并侦听新请求。
让具有parentID的用户能够将senderuid的值写入true或“accepted”,这非常适合您。
然后创建一个云函数(触发器)来监听
friendRequests/{userUID}/{senderUID}
上的更新,如果该值为true,则添加到两个friend列表中,列出每个用户的ID。如果为false,请删除此引用。
由于根据您的数据结构编写所有这些代码将花费大量时间,因此我将为您提供已经存在的代码,但您必须重写它: 规则如下:

Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false]) 
"friendList": {
  "$uid":{
    ".read" : "$uid === auth.uid",
    "$friendUID": {
      ".write": "$uid === auth.uid && data.exists() && newData.val() == false"
    }
  }
},

"friendRequest": {
  "$uid": {
    ".read" : "$uid === auth.uid",
    "$senderUID": {
      ".write" : "$senderUID === auth.uid && $senderUID != $uid && !data.exists() && root.child('userInfo').child($uid).exists() && !root.child('blockList').child($uid).child($senderUID).exists() && !root.child('blockList').child($senderUID).child($uid).exists() && !root.child('friendList').child($uid).child($senderUID).exists() && !root.child('friendList').child($senderUID).child($uid).exists() && !root.child('friendRequest').child($senderUID).child($uid).exists()",
      ".validate": "newData.hasChildren(['message', 'date'])",
      "message": {
        ".validate": "newData.isString() && newData.val().length < 51 && newData.val().length > 0"
      },
      "date": {
        ".validate": "newData.val() == now" // ServerValue.TIMESTAMP
      },
      "accepted": {
        ".write" : "$uid === auth.uid && $uid != $senderUID && (newData.val() == true || newData.val() == false) && !data.exists() && root.child('friendRequest').child($uid).child($senderUID).exists()"
      },
      "$other": {
        ".validate": false
      }

    }
  }
},

"blockList":{
  "$uid":{
    ".read": "$uid === auth.uid",
    "$blockUID": {
      ".write" : "$uid === auth.uid && $uid != $blockUID && ( ((!data.exists() && newData.val() == true) || (data.exists() && !newData.exists())) ) && root.child('userInfo').child($blockUID).exists()"
    }
  }
},

你可以移除阻塞并做你自己的事情。这是100%有效的,因为我已经在这个应用程序中对它进行了测试:

您可以创建另一个节点friendRequests,在这个节点中,您可能有密钥为userUIDs和data的child
senderUID1:datelong,senderUID2:datelong
,只需在您的应用程序dbref.child('friendRequests/'+userUID)中侦听即可.addChildEventListener,您将获得所有已存在的好友请求并侦听新请求。
Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false]) 
让具有parentID的用户能够将senderuid的值写入true或“accepted”,这非常适合您。
然后创建一个云函数(触发器)来监听
friendRequests/{userUID}/{senderUID}
上的更新,如果该值为true,则添加到两个friend列表中,列出每个用户的ID。如果为false,请删除此引用。
由于根据您的数据结构编写所有这些代码将花费大量时间,因此我将为您提供已经存在的代码,但您必须重写它: 规则如下:

Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false]) 
"friendList": {
  "$uid":{
    ".read" : "$uid === auth.uid",
    "$friendUID": {
      ".write": "$uid === auth.uid && data.exists() && newData.val() == false"
    }
  }
},

"friendRequest": {
  "$uid": {
    ".read" : "$uid === auth.uid",
    "$senderUID": {
      ".write" : "$senderUID === auth.uid && $senderUID != $uid && !data.exists() && root.child('userInfo').child($uid).exists() && !root.child('blockList').child($uid).child($senderUID).exists() && !root.child('blockList').child($senderUID).child($uid).exists() && !root.child('friendList').child($uid).child($senderUID).exists() && !root.child('friendList').child($senderUID).child($uid).exists() && !root.child('friendRequest').child($senderUID).child($uid).exists()",
      ".validate": "newData.hasChildren(['message', 'date'])",
      "message": {
        ".validate": "newData.isString() && newData.val().length < 51 && newData.val().length > 0"
      },
      "date": {
        ".validate": "newData.val() == now" // ServerValue.TIMESTAMP
      },
      "accepted": {
        ".write" : "$uid === auth.uid && $uid != $senderUID && (newData.val() == true || newData.val() == false) && !data.exists() && root.child('friendRequest').child($uid).child($senderUID).exists()"
      },
      "$other": {
        ".validate": false
      }

    }
  }
},

"blockList":{
  "$uid":{
    ".read": "$uid === auth.uid",
    "$blockUID": {
      ".write" : "$uid === auth.uid && $uid != $blockUID && ( ((!data.exists() && newData.val() == true) || (data.exists() && !newData.exists())) ) && root.child('userInfo').child($blockUID).exists()"
    }
  }
},

你可以移除阻塞并做你自己的事情。这是100%有效的,因为我已经在这个应用程序中进行了测试:

首先想到的是安全规则。您是否有允许用户只写入自己数据的安全规则?如果是,,您还应该在客户端日志中找到写入操作不起作用的错误消息。我的读和写安全设置都设置为true@LynnO“Brian只需在朋友请求时创建一个单独的节点挂起请求,并在接受该请求时将该节点添加到朋友列表中。”首先想到的是安全规则。您是否有允许用户只写入自己数据的安全规则?如果是,,您还应该在客户端日志中找到写入操作不起作用的错误消息。我的读和写安全设置都设置为true@LynnO“Brian只需在朋友请求时创建一个单独的节点挂起请求,并在接受该请求时将该节点添加到朋友列表中。”感谢您提供的帮助反馈我想我能够解决我的问题。感谢您的宝贵反馈!我想我能解决我的问题。
Ref.child("users").child(currentUserUid!).child("Friends").updateChildValues([userClickedOnId! : false])