Swift 连接firebase请求
我在firebase中观察到一个子值,在收到一个子值后,我需要在第一个请求中的另一个ref中查找其他属性 这是firebase结构:Swift 连接firebase请求,swift,firebase,Swift,Firebase,我在firebase中观察到一个子值,在收到一个子值后,我需要在第一个请求中的另一个ref中查找其他属性 这是firebase结构: { "chats" : { "11-126" : { "-LJZTRGt4lqMFjfgQqH0" : { "attachmentType" : 6, "body" : "kdnfif", "date" : 1533915284798, "delivered" : fa
{
"chats" : {
"11-126" : {
"-LJZTRGt4lqMFjfgQqH0" : {
"attachmentType" : 6,
"body" : "kdnfif",
"date" : 1533915284798,
"delivered" : false,
"id" : "-LJZTRGt4lqMFjfgQqH0",
"loaded" : true,
"managed" : false,
"recipientId" : "11",
"selected" : false,
"senderId" : "126",
"senderName" : "Porter Project",
"sent" : true,
"valid" : true
}
},
"121-123" : {
"-LK7DHLChxxqKLvn4dRa" : {
"attachmentType" : 6,
"body" : "Hola",
"date" : 1534515029389,
"delivered" : true,
"id" : "-LK7DHLChxxqKLvn4dRa",
"loaded" : true,
"managed" : false,
"recipientId" : "123",
"selected" : false,
"senderId" : "121",
"senderName" : "Yoel",
"sent" : true,
"valid" : true
},
"-LK7ELGPbdext9hyliAh" : {
"attachment" : {
"bytesCount" : 51302,
"loaded" : true,
"managed" : false,
"name" : "IMG-20180816-WA0002.jpeg",
"url" : "https://firebasestorage.googleapis.com/v0/b/roomatch-209023.appspot.com/o/RooMatch%2FImage%2FIMG-20180816-WA0002.jpeg?alt=media&token=3baa3bdd-4280-4e6f-b190-bddd4fcffc17",
"valid" : true
},
"attachmentType" : 2,
"date" : 1534515306654,
"delivered" : false,
"id" : "-LK7ELGPbdext9hyliAh",
"loaded" : true,
"managed" : false,
"recipientId" : "121",
"selected" : false,
"senderId" : "123",
"senderName" : "Chab1",
"sent" : true,
"valid" : true
},
"-LK8z6O3HFp9ckfwaqnD" : {
"attachmentType" : 6,
"body" : "Un texto",
"date" : 1534544606647,
"delivered" : true,
"id" : "-LK8z6O3HFp9ckfwaqnD",
"loaded" : true,
"managed" : false,
"recipientId" : "123",
"selected" : false,
"senderId" : "121",
"senderName" : "Yoel",
"sent" : true,
"valid" : true
},
"-LKFHdpEFat-eX7xAQdu" : {
"attachmentType" : 6,
"body" : "recibido texto",
"date" : 1534650391854,
"delivered" : false,
"id" : "-LKFHdpEFat-eX7xAQdu",
"loaded" : true,
"managed" : false,
"recipientId" : "121",
"selected" : false,
"senderId" : "123",
"senderName" : "Chab1",
"sent" : true,
"valid" : true
},
"-LKRy6pZwjNnvJwx43Bn" : {
"attachmentType" : 6,
"body" : "jjj",
"date" : 1534863113383,
"delivered" : false,
"id" : "-LKRy6pZwjNnvJwx43Bn",
"loaded" : true,
"managed" : false,
"recipientId" : "121",
"selected" : false,
"senderId" : "123",
"senderName" : "Chab1",
"sent" : true,
"valid" : true
},
"-LKRze2KNk8xdgsdmq-B" : {
"attachmentType" : 6,
"body" : "gfx",
"date" : 1534863515671,
"delivered" : false,
"id" : "-LKRze2KNk8xdgsdmq-B",
"loaded" : true,
"managed" : false,
"recipientId" : "121",
"selected" : false,
"senderId" : "123",
"senderName" : "Chab1",
"sent" : true,
"valid" : true
},
"-LKRzmsc5vPBxeJdneNQ" : {
"attachment" : {
"bytesCount" : 51125,
"loaded" : true,
"managed" : false,
"name" : "IMG-20180816-WA0000.jpeg",
"url" : "https://firebasestorage.googleapis.com/v0/b/roomatch-209023.appspot.com/o/RooMatch%2FImage%2FIMG-20180816-WA0000.jpeg?alt=media&token=688f8d78-5419-4986-8b21-1e030a0b9da4",
"valid" : true
},
"attachmentType" : 2,
"date" : 1534863551851,
"delivered" : false,
"id" : "-LKRzmsc5vPBxeJdneNQ",
"loaded" : true,
"managed" : false,
"recipientId" : "121",
"selected" : false,
"senderId" : "123",
"senderName" : "Chab1",
"sent" : true,
"valid" : true
}
}},
"users" : {
"121" : {
"id" : "121",
"image" : "",
"loaded" : true,
"managed" : false,
"name" : "Yoel",
"nameToDisplay" : "Yoel Jimenez",
"online" : true,
"selected" : false,
"status" : "Added!",
"typing" : false,
"valid" : true
},
"122" : {
"id" : "122",
"image" : "https://lh6.googleusercontent.com/-RX7ka61PxvY/AAAAAAAAAAI/AAAAAAAAADw/8d1DyKgF4y4/photo.jpg?sz=50",
"loaded" : true,
"managed" : false,
"name" : "QtJambiii",
"nameToDisplay" : "QtJambiii",
"online" : false,
"selected" : false,
"status" : "Added!",
"typing" : false,
"valid" : true
},
"123" : {
"id" : "123",
"image" : "http://www.freecashrewards.co/roomatch/api/photo/HO8rxjXhMHConKe2BG3GItNoHDZ6ENs9LqJHlZRj.jpeg",
"loaded" : true,
"managed" : false,
"name" : "Chab1",
"nameToDisplay" : "Chab1",
"online" : false,
"selected" : false,
"status" : "Added!",
"typing" : false,
"valid" : true
},
"124" : {
"id" : "124",
"image" : "",
"loaded" : true,
"managed" : false,
"name" : "Leo",
"nameToDisplay" : "Leo",
"online" : false,
"selected" : false,
"status" : "Added!",
"typing" : false,
"valid" : true
},
"125" : {
"id" : "125",
"image" : "https://lh4.googleusercontent.com/-9Mi0fhtOqMQ/AAAAAAAAAAI/AAAAAAAAAAA/AAnnY7pGdlGynOdTmxd6p3MflUn0BXjjww/mo/photo.jpg?sz=50",
"loaded" : true,
"managed" : false,
"name" : "Oscar",
"nameToDisplay" : "Oscar",
"online" : false,
"selected" : false,
"status" : "Added!",
"typing" : false,
"valid" : true
},
"131" : {
"id" : "131",
"image" : "",
"loaded" : true,
"managed" : false,
"name" : "Marta",
"nameToDisplay" : "Optional(\"Marta\") Optional(\"gr\")",
"online" : true,
"selected" : false,
"status" : "Added!",
"typing" : false,
"valid" : true
}
}
}
我正在阅读chats all children,如果child id有一些我需要的字符串,我将提取该child的值,该child有一个值recipientId,它是users child中的用户id。我需要检索id等于recipientID的子级的用户值。我尝试了不同的方法,但都返回零
以下是我尝试的代码:
chatsRef.observe(.childAdded, with: { [weak self] snapshot in
if snapshot.key.contains(String(requestManager.instance.user.id!)){
if let snapshot = snapshot.children.allObjects as? [DataSnapshot]{
for snap in snapshot{
if let data = snap.value as? [String: Any]{
let id = data["id"] as! String
let message = data["body"] as? String
let senderId = data["senderId"] as! String
let recipientId = data["recipientId"] as! String
var name: String?
var preurl = ""
print("the recipient id \(recipientId)")
// Constants.refs.databaseUser.child(recipientId).observeSingleEvent(of: .value, with: {snap in
// print(snap.value as Any)
// let da = snap.value as! [String: Any]
// name = da["name"] as! String
// preurl = da["name"] as! String
// })
var url = ""
// Constants.refs.databaseUser.child(recipientId).child("name").observe(.value, with: { snap1 in
// print("")
// name = snap1.value as? String
// })
// Constants.refs.databaseUser.child(recipientId).child("image").observe(.value, with: { snap2 in
// preurl = snap2.value as! String
// })
if senderId == String(requestManager.instance.user.id!){
url = Router.baseURLString + (requestManager.instance.user.image?.path.replacingOccurrences(of: "images", with: "/photo"))!
}else{
//url = self?.rootRef.child("users").child(recipientId).value(forKey: "image") as! String
// self?.rootRef.child("users").child(recipientId).child("name").observe(.value, with: { snap in
// url = snap.value as! String
// })
url = preurl
}
代码以附加到coreData的更多内容结束,但这不是问题所在。问题是,所有的注释代码none works都返回nil作为name值,而image的get为空字符串“”。我正在找回id为121-123的聊天孩子。某个孩子的收件人id等于123。所以我在观察用户child 12。但总是零。这种行为是因为它是异步的,并且在请求完成之前传递了代码,或者是因为我在读取错误的子用户。
PD:因为康斯坦特夫是这样的
struct Constants
{
struct refs
{
static let databaseRoot = Database.database().reference()
static let databaseChats = databaseRoot.child("chats")
static let databaseUser = databaseRoot.child("users")
}
}
看看代码,如果我读对了,就会发现您迭代了聊天中的每个子节点。然后测试每个读入节点,以查看刚刚读入的快照的键是否与特定的user.id匹配。如果这就是目的,那么就不需要了。如果你知道一条特定的路径,那么就阅读它。i、 e.如果你知道你正在寻找聊天/uid_5,那么只需在中阅读该节点即可。键在节点中是唯一的,因此在聊天中只有一个/chats/uid_5。问题是聊天中没有插入用户数据。问题是,我必须在获取用户数据后执行所有流程,因为firebase中的异步。为了清楚起见,我在子节点中搜索key containin一些值,如果该值匹配,那么我需要在user中搜索特定的子值。用户和子节点是兄弟。您不能直接在Firebase中执行部分字符串搜索,因此无法在子节点中搜索某些值中的关键字。我认为可能有更好的方法来解决这个问题。不清楚为什么不在聊天中存储用户数据(如UID),以便知道是谁发送了聊天信息。还不清楚asych导致了什么问题,因为您已经将数据写入Firebase,所以只需将其取出即可。也许你可以澄清你想做什么以及具体的问题是什么。问题是聊天时使用userid userid作为键,然后使用recipientId和senderId等字段。使用发送id,我需要查询用户并请求recipientId值以获取名称和图像url。如果我完成了所有的消息在值内追加。我得到了我所需要的所有数据,但如果没有得到null o“”,你是说chats有userid userid作为键,这意味着/chats节点中的子键是userid userid?那么“11-126”是一个userid userid?如果是,那是什么类型的用户ID?另外,我看到这些节点的子节点有一个键,然后是一个不必要的重复的子“id”。换句话说,您不需要与节点的键匹配的子id,因为该键始终可以从snapshot.key中检索。