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