Ios 两个相同类型的数组,一个正在更新,另一个为nil
我有两个数组,一个在视图控制器中(Ios 两个相同类型的数组,一个正在更新,另一个为nil,ios,swift,firebase,firebase-realtime-database,nsobject,Ios,Swift,Firebase,Firebase Realtime Database,Nsobject,我有两个数组,一个在视图控制器中(var-usersRooms:[Room]=[]),另一个在User对象中(var-rooms:[Room]=[])。视图控制器中有对对象的引用(var currentUser:User?)。A您可以看到,两个阵列都是[Room]类型 在下面的函数中,我调用Firebase来检索用户信息并设置user对象 func getUserInfo() { guard let uid = FIRAuth.auth()?.currentUser?.uid else
var-usersRooms:[Room]=[]
),另一个在User
对象中(var-rooms:[Room]=[]
)。视图控制器中有对对象的引用(var currentUser:User?
)。A您可以看到,两个阵列都是[Room]
类型
在下面的函数中,我调用Firebase来检索用户信息并设置user
对象
func getUserInfo() {
guard let uid = FIRAuth.auth()?.currentUser?.uid else {print("Error getting user UID"); return}
let userRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users").child(uid)
let userRoomRef: FIRDatabaseReference = FIRDatabase.database().reference().child("users").child(uid).child("rooms")
self.currentUser?.uid = uid
userRef.observeSingleEvent(of: .value, with: { (snapshot) in
if let usersDict = snapshot.value as? NSDictionary {
print("\n\nUserDict: \(usersDict)\n\n")
guard let name = usersDict["name"] as? String else {print("Error getting user's name"); return}
guard let handle = usersDict["handle"] else {print("Error getting user's handle"); return}
guard let gender = usersDict["gender"] else {print("Error getting user's gender"); return}
guard let profilePicture = usersDict["profilePicture"] else {print("Error getting user's profilePicture"); return}
// how to get user's rooms from FB and add into User object's rooms array??
userRoomRef.observeSingleEvent(of: .value, with: { (roomSnap) in
for eachRoom in roomSnap.value as! [String : AnyObject] {
let roomID = eachRoom.key as! String
userRoomRef.child(roomID).observeSingleEvent(of: .value, with: { (roomSnap) in
if let roomInfo = roomSnap.value as? [String : AnyObject] {
guard let roomName = roomInfo["roomName"] as! String! else {print("Error getting room name"); return}
guard let participants = roomInfo["participants"] as! [String]! else {print("Error getting room participants"); return}
print("\n\nRoom Name: \(roomName)\nRoom Participants: \(participants)\nRoom ID: \(roomID)\n")
self.usersRooms.append(Room(id: roomID, name: roomName, participants: participants))
self.currentUser?.rooms.append(Room(id: roomID, name: roomName, participants: participants))
print("\n\nUser's Rooms: \(self.usersRooms)\n\n")
print("\n\nRooms (from currentUser): \(self.currentUser?.rooms)\n\n")
}
})
}
})
print("\nRoomsTableViewController User Values:\n\nName: \(name)\nHandle: \(handle)\nGender: \(gender)\nProfile Picture: \(profilePicture)\n\n")
self.currentUser?.handle = handle as! String
self.currentUser?.name = name
self.senderDisplayName = name
self.currentUser?.profilePicture = profilePicture as! String
self.currentUser?.gender = gender as! String
}
})
}
在该函数中,我尝试以完全相同的方式附加两个数组作为测试:
self.usersRooms.append(Room(id: roomID, name: roomName, participants: participants))
self.currentUser?.rooms.append(Room(id: roomID, name: roomName, participants: participants))
当我在下一行打印它们时,usersRooms
数组按预期充满了Room
对象。但是,User
,currentUser.rooms
中的数组为零。即使我尝试说self.currentUser?.rooms=self.usersRooms
,它仍然是零
为什么我可以在我的对象中设置
usersRooms
数组,但不能设置相同的数组?如果self.currentUser
为nil
,那么可选的链接self.currentUser?.rooms.append()
或self.currentUser?.rooms=…
可以。。。。没什么@MartinR但是不应该用append填充self.currentUser.rooms,就像填充usersRooms
数组一样?它们是相同的东西,即一个类型为Room
的数组,那么为什么一个填充了append,而另一个没有?基本上,当它们都是Swift书籍中的一个var*whatever*:[Room]=[]
查找“可选链接”时,我对一个有效而另一个无效的原因感到困惑。如果a
为nil
则a?。无论什么…
都不起作用。如果不分配当前用户,那么当前用户应该来自哪里?currentUser
是user
对象,在视图控制器中使用var currentUser:user?
初始化。所有其他currentUser值的设置都没有问题,我遇到这个问题的只是房间
,所以我想知道如何设置房间
,就像我在同一个函数中成功设置了所有其他值一样。正如我所说,为什么我可以设置var usersRooms:[Room]=[]
,而不能设置var rooms:[Room]=[]
?