2017-11-04 12 views
0

私は何が問題を助けてくれるのかわかりません。 Firebaseデータベースから特定のメッセージを受け取ったときに価値が得られますが、私のアプリは1行でクラッシュしました。私のコードで何が間違っているか教えてください。以下は私の機能です。また、エラーのスクリーンショットも提供しています。iosの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

私を助けてください。 ありがとうございました。

+0

コードのスクリーンショットを追加する代わりに、実際のコードを質問に追加してください。エラーメッセージをキャプチャするには、赤いインジケータと「Issue Navigatorで表示」を右クリックします。 –

答えて

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) 
     } 

    } 

考えられるであろう物事のカップルを行います。メッセージがあり、文字列(前に問題があった可能性があります)であれば、コールバックが発生します。

+0

If条件に入力されません。 –

+0

次に、フェッチしている値にメッセージがありません。 'print(snapshot.value)'を実行し、返されるものを投稿してください – Chris

+0

これらの値はあります。 ["-KxSfTvfhGVxH2Yet8zU":{ 日付= "2017/10/27"; message = hi; sender = web; ステータス= 0; 時間= "5:23 PM"; }] –

関連する問題