如何从ios中的firebase数据库获取最新消息

时间:2017-11-04 07:17:29

标签: ios swift firebase firebase-realtime-database

我不知道有什么问题请帮帮我。当我从firebase数据库收到一条特定的消息,然后价值越来越高但是我的应用程序在一行上崩溃了。所以请告诉我在我的代码中我做错了什么。下面是我的函数。我们还提供错误的屏幕截图。

 func getLatestMessageFromFirebase(token:String,completionmessage: @escaping (_ message:String) -> Swift.Void)
    {
        print("getModelFromFirebase")
        var message:String=""
        ref.child("chatmessage/devicetoken/").child(token).queryLimited(toLast: 1).observeSingleEvent(of: .value, with: { (snapshot) in
            // Get user value
            let value = snapshot.value as? NSDictionary
            if value?["message"] as? String != ""
            {
                DispatchQueue.main.async
                    {
                        message = (value?["message"] as? String)! //My app stop on this line
                        completionmessage(message)
                }


            }
        })
        { (error) in
            print(error.localizedDescription)
        }

    }

func callAPI()
{
                                let response = (jsonResult.object(forKey: "chatListArr") as? NSArray)!
                                if response.count > 0
                                {
                                    for i in 0..<response.count
                                    {
                                        let dict = response[i] as! NSDictionary
                                        let chatlist = ChatList(dict: dict)
                                        self.arr_list.append(chatlist)
                                    }
                                    for i in 0..<self.arr_list.count
                                    {
                                        let chatlist = self.arr_list[i]
                                        self.getLatestMessageFromFirebase(token: chatlist.token, completionmessage: { (message) in
                                            self.arr_list[i].msg = message
                                        })
                                    }

                                    self.table_view.reloadData()
                                }
}

enter image description here

请帮帮我。 在此先感谢。

1 个答案:

答案 0 :(得分:1)

首先,你应该清理一下你的代码,你会做一些被认为是反模式的事情

 func getLatestMessageFromFirebase(token:String,completionmessage: @escaping (_ message:String) -> Swift.Void)
    {
        ref.child("chatmessage/devicetoken/").child(token).queryLimited(toLast: 1).observeSingleEvent(of: .value, with: { (snapshot) in
            // Get user value
            for snap in snapshot.children.allObjects as [DataSnapshot] {
              let value = snap.value as? [String: Any] ?? [:] // A good way to unwrap optionals in a single line
              if let message = value["message"] as? String {
                DispatchQueue.main.async {
                    completionmessage(message)
                  }
              }
           }
        })
        { (error) in
            print(error.localizedDescription)
        }

    }

使用上面的代码,您的应用程序不应该崩溃。如果有消息且它是一个字符串(之前可能是您的问题),那么您的回调将会触发。