ios - 无法使用来自 Firebase 数据库的数据填充数组

标签 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;

我正在尝试提取除消息部分之外的所有数据,我计划稍后在应用程序中执行此操作。

此数据(不包括“消息”部分)像这样写入 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 是一次非常令人沮丧的经历,我对此深表遗憾。但现在回过头去寻找更好的东西可能为时已晚,即提供明确说明如何使其发挥作用的平台。

最佳答案

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

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

即使用child代替snapshot


更新。原来使用 NSDictionary 而不是 Dictionary 修复了 dict 常量崩溃。但是,除了编译器错误之外,仍然不清楚为什么......

关于ios - 无法使用来自 Firebase 数据库的数据填充数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44088204/

相关文章:

ios objective-c , boolean 切换警告

swift - Vapor 连接到 SQLite 数据库

firebase - 将 SearchField 添加到从 Firestore 读取的 StreamBuilder

ios - 使用正则表达式删除空行

ios - 如何获取facebook好友的公开信息。?

ios - 将 "Edit"按钮添加到 UIViewController

iphone - 如果我们在真正的预提交处理程序中,由于 CA 的限制,我们实际上不能添加任何新的围栏——这是否意味着什么?

javascript - Angular 2 Observables - 对 Action 的空响应仍然显示数组中的数据

reactjs - 如何使用react-redux-firebase从firestore获取子集合

ios - Cordova/appFramework 应用程序在 iOS 上显示为空白