0

我有我需要在字典中输入的JSON数据,然后附加到数组。firebase json反序列化swift

下面一种情况,即应该发生,但我得到的错误

这个类不是键值为重点 K0tA3yTnxAWxCFBZoeyAjcr3yYy1顺应编码-“。

let room = rooms[indexPath.row] 

if let dictionary = room.members { 

    let user = User() 

    user.setValuesForKeys(dictionary) 

    liveCell.members.append(user) 

} 

下面是类

用户

class User: NSObject { 
    var email: String? 
    var name: String? 
    var profileImageUrl: String? 
} 

class Room: NSObject { 
    var rid: String? 
    var owner: String? 
    var groupChatName: String? 
    var groupChatDescription: String? 
    var members: NSDictionary? 
} 

房对象在数据库

"rooms" : { 
    "B7C7E469-945E-4327-9473-AAE34FCB9B41" : { 
     "groupChatDescription" : "123ae", 
     "groupChatName" : "Test123", 
     "members" : { 
     "K0tA3yTnxAWxCFBZoeyAjcr3yYy1" : { 
      "email" : "[email protected]", 
      "name" : "Steve", 
      "profileImageUrl" : "https://firebasestorage.googleapis.com" 
     } 
     }, 
     "owner" : "Steve" 
    } 
}, 

回顾一下,房间是一组房间,房间是特定的房间对象,成员是一组用户,而成员是特定的用户。

我已经使用字典方法从我的数据库中检索用户,但我发现数据快照之间存在一些差异。从火力地堡

snapshot.value:

Optional({ 
    email = "[email protected]"; 
    name = Steve; 
    profileImageUrl = 
"https://firebasestorage.googleapis.com"; 
}) 

此格式适用于字典

数据快照使用print(room.members)

Optional({ 
    K0tA3yTnxAWxCFBZoeyAjcr3yYy1 =  { 
     email = "[email protected]"; 
     name = Steve; 
     profileImageUrl = 
"https://firebasestorage.googleapis.com"; 
    }; 
}) 

该格式不因为我相信字典工作这是因为关键,但我不知道如何摆脱它,因为这基本上是我如何分隔成员数组中的每个成员。

有什么建议吗?

至于什么liveCell是这里是一个屏幕截图,解释得很好... Screenshot

这是一个liveCell,你能看到的数据相匹配。黄色矩形是另一个uicollectionview,它包含成员profileimages的数组,其中每个配置文件图像将位于红色方框内。

希望这将清除的东西了

+0

有没有在这个问题缺少一些信息(为什么自我。 liveCell?有成员?),它有点不清楚,*成员是用户数组* *不清楚 - 它似乎被定义为用户类中的通用*字典*。也许你的意思是把它定义为像[Users]这样的用户数组?或者也许它应该是一个字典?也许这是另一个阵列?你能否清理这个问题,因为我认为答案应该很简单。 – Jay

+0

@Jay我编辑了这个问题 – Stefan

回答

1

而不是试图修复所有的代码,这里是一个干净,简单的方法来填充房间数组,每个房间都有一个用户数组。

鉴于类似你们

"rooms" 
    "room_0" 
     "groupChatName" : "Test123", 
     "members" 
     "user_0" 
      "name" : "Barry" 
     "user_1" 
      "name" : "Maurice" 
     "user_2" 
      "name" : "Robin" 

一个火力地堡结构我们开始与RoomClass和UserClass的。请注意,我会让这些类完成繁重的工作 - 它们会取消快照并存储它的值。

请注意,我将成员子节点视为快照,以便我可以在维护其关键值对时对其进行迭代。

class RoomClass { 
    var key = "" 
    var groupChatName = "" 
    var membersArray = [UserClass]() 

    init(snapshot: DataSnapshot) { 
     let dict = snapshot.value as! [String: Any] 
     let membersSnap = snapshot.childSnapshot(forPath: "members") 
     let snapKey = snapshot.key 
     let groupName = dict["groupChatName"] as! String 

     self.key = snapKey 
     self.groupChatName = groupName 

     for member in membersSnap.children { 
      let memberSnap = member as! DataSnapshot 
      let user = UserClass(snapshot: memberSnap) 
      self.membersArray.append(user) 
     } 
    } 
} 

class UserClass { 
    var key = "" 
    var name = "" 

    init(snapshot: DataSnapshot) { 
     let dict = snapshot.value as! [String: Any] 
     let snapKey = snapshot.key 
     let userName = dict["name"] as! String 
     self.key = snapKey 
     self.name = userName 
    } 
} 

然后,我们定义数组存储室和代码来填充它

var roomsArray = [RoomClass]() 

func doButton0Action() { 
    let roomsRef = self.ref.child("rooms") 
    roomsRef.observeSingleEvent(of: .value, with: { snapshot in 

     for child in snapshot.children { 
      let snap = child as! DataSnapshot 
      let room = RoomClass(snapshot: snap) 
      self.roomsArray.append(room) 
     } 

     //this just demonstrates the rooms and members are loaded 
     for room in self.roomsArray { 
      let groupChatName = room.groupChatName 

      print(groupChatName) 

      for user in room.membersArray { 
       let userName = user.name 
       print(" \(userName)") 
      } 
     } 
    }) 
} 

和输出

Test123 
    Barry 
    Maurice 
    Robin 
+0

很好。谢谢。 – Stefan

0

怪异的解决方案,但你不应该强制转换为[字符串:AnyObject]与火力点。它也从来没有为我工作,但做:

snapshot.value as? [String:Any] 

已工作。开发人员有责任通过适当地添加可能的密钥snapshot.value来添加自定义类来解释自定义用例(房间,汽车等的类)中的快照值。

+0

我仍然不能'member.setValuesForKeys(userDictionary)'发射 – Stefan