无法使用Firebase数据库中的数据填充数组

时间:2017-05-20 16:19:07

标签: ios swift firebase firebase-realtime-database

下面我尝试创建一个数组ChatListings,但它不起作用。

let chatRef = FIRDatabase.database().reference().child("chatListings")


override func viewDidLoad() {
    super.viewDidLoad()
    let firstQuery = chatRef.queryOrdered(byChild: "userID").queryEqual(toValue: userID)
    firstQuery.observe(FIRDataEventType.value, with: { snapshot in
        for child in snapshot.children {
            print("child is \(child)")
            if let dict = snapshot.value as? Dictionary<String, AnyObject>{
                print("dict is \(dict)")
                let roomKey = dict["chatRoomKey"] as! String
                let oUID = dict["otherUserID"] as! String
                let oUserName = dict["otherUserName"] as! String
                let oProfilePic = dict["otherUserProfilePic"] as! String
                let userIDTemp = dict["userID"] as! String
                chatListing = ChatListing(chatRoomKey: roomKey, UID: userIDTemp, name: oUserName, otherUserID: oUID, otherUserProfilePicURL: oProfilePic)
                chatListings.append(chatListing)
            }
        }
        print("chatListings = \(chatListings)")
    })
}

这崩溃说编译器在解包Optional值时意外发现了nil。我不知道为什么它不会工作。我已经尝试过每一种我能找到的方法来提取编译器在崩溃之前读取的数据或者未能填充我的聊天列表中的数据。对象。

这是编译器读取的数据示例,但无法通过4种不同的编码尝试进行提取:

"-KjdSF97Q2z3afXzkwQ9": {
chatRoomKey = "-KjdSF97Q2z3afXzkwQ9";
messages =     {
    "-KjdSOVTsg8jEy6SeEA2" =         {
        MediaType = PHOTO;
        fileUrl = "https://firebasestorage.googleapis.com/v0/b/preollify.appspot.com/o/mget8KN2nHe4sOhbnWTixYvCOrr2%2F515963239.371526?alt=media&token=6cb12ec1-5bdb-43a1-ab49-90c90570b341";
        senderId = mget8KN2nHe4sOhbnWTixYvCOrr2;
        senderName = Michael;
    };
    "-KjdSPxpNT0pkQ1y5-_1" =         {
        MediaType = VIDEO;
        fileUrl = "https://firebasestorage.googleapis.com/v0/b/preollify.appspot.com/o/mget8KN2nHe4sOhbnWTixYvCOrr2%2F515963229.282051?alt=media&token=04671c8e-d7f1-49f2-81d0-09836c034ae2";
        senderId = mget8KN2nHe4sOhbnWTixYvCOrr2;
        senderName = Michael;
    };
    "-KjdVaVTfbaC-3S-91-A" =         {
        MediaType = TEXT;
        senderId = mget8KN2nHe4sOhbnWTixYvCOrr2;
        senderName = Michael;
        text = The;
    };
};
otherUserID = aRandomUser3611;
otherUserName = Michael;
otherUserProfilePic = "https://firebasestorage.googleapis.com/v0/b/preollify.appspot.com/o/ProfilePictures%2Fmget8KN2nHe4sOhbnWTixYvCOrr2%2FmediumProfilePicture.jpg?alt=media&token=d88afa5d-0db7-4ce2-95c9-3038ff592e9f";
userID = mget8KN2nHe4sOhbnWTixYvCOrr2;

我试图提取所有数据但是消息部分,我计划稍后在应用中进行。

这些数据(不包括&#34;消息&#34;部分)写在chatViewController的viewDidLoad中,如下所示:

    let preMessageRef = chatRef.childByAutoId()
    chatListingID = preMessageRef.key
    let initialChatRoomData = ["chatRoomKey": chatListingID, "otherUserID": otherUID, "otherUserName": otherUserName, "otherUserProfilePic": otherUserProfilePicURLString, "userID": userID]
    preMessageRef.setValue(initialChatRoomData)

从Firebase数据库中检索数据对我来说已经完全成功或失败,复制成功尝试提取数据很少工作两次。他们的文档很少,以至于遗漏的方式太多,因为它对如何在现实世界中提取数据提供的帮助很小。为什么人们喜欢Firebase?使用Firebase一直是一个非常令人沮丧的经历,我非常后悔。但是,现在回过头来做更好的事情可能为时已晚,即一个提供如何使其发挥作用的明确指导的平台。

1 个答案:

答案 0 :(得分:2)

我认为你只是有一个愚蠢的错字。试试这个:

let childData = child as! FIRDataSnapshot
print("child key: \(childData.key)")
if let dict = childData.value as? Dictionary<String, AnyObject> {
    ...
}

即,使用child代替snapshot

<强>更新即可。结果是使用NSDictionary而不是Dictionary修复了dict常量崩溃问题。但是,除了编译器错误之外,还不清楚为什么......