Сбои приложения при просмотре данных чата в реальном времени с Firebase-iOS - PullRequest
0 голосов
/ 24 мая 2018

В настоящее время я изучаю Swift, и я решил создать приложение для обмена сообщениями iOS, используя Firebase.Я использую JSQMessageViewController в качестве шаблона чата, и все работает нормально, за исключением того, что приложение аварийно завершает работу, когда два пользователя, разговаривающие друг с другом, одновременно находятся в комнате чата.Я получаю эту ошибку в нижней части функции ниже: «Поток 1: EXC_BAD_INSTRUCTION (code = EXC_I386_INVOP, subcode = 0x0)»

Вот мой код для наблюдения и извлечения данных сообщения.Я звоню так каждый раз, когда появляется вид:

private func observeMessages() {
    messageRef = ref.child("ChatRooms").child(chatRoomId!).child("Messages")

    let messageQuery = messageRef.queryLimited(toLast:25)

    newMessageRefHandle = messageQuery.observe(.childAdded, with: { (snapshot) in

        let messageData = snapshot.value as! Dictionary<String, AnyObject>


        if  let data        = snapshot.value as? [String: AnyObject],
            let id          = data["sender_id"] as? String,
            let name        = data["name"] as? String,
            let text        = data["text"] as? String,
            let time        = data["time"] as? TimeInterval,
            !text.isEmpty
        {
            if id != uid! {
                let updateRead  = ref.child("ChatRooms").child(self.chatRoomId!).child("Messages").child(snapshot.key)
                updateRead.updateChildValues(["status":"read"])
            }
            if let message = JSQMessage(senderId: id, senderDisplayName: name, date: Date(timeIntervalSince1970: time), text: text)
            {
                self.messages.append(message)

                self.finishReceivingMessage()
            }

        }else if let id = messageData["senderId"] as! String!,
            let photoURL = messageData["photoURL"] as! String! { // 1

            if let mediaItem = JSQPhotoMediaItem(maskAsOutgoing: id == self.senderId) {

                self.addPhotoMessage(withId: id, key: snapshot.key, mediaItem: mediaItem)

                if photoURL.hasPrefix("gs://") {
                    self.fetchImageDataAtURL(photoURL, forMediaItem: mediaItem, clearsPhotoMessageMapOnSuccessForKey: nil)
                }
            }
        }else {
            print("Error! Could not decode message data")
        }
    })
    updatedMessageRefHandle = messageRef.observe(.childChanged, with: { (snapshot) in
        let key = snapshot.key

        //I am getting an error on this line 
        let messageData = snapshot.value as! Dictionary<String, String> 

        if let photoURL = messageData["photoURL"] as String! { 
            // The photo has been updated.
            if let mediaItem = self.photoMessageMap[key] { 
                self.fetchImageDataAtURL(photoURL, forMediaItem: mediaItem, clearsPhotoMessageMapOnSuccessForKey: key)
            }
        }
    })
}

Интересно, что я могу здесь делать неправильно.Вся помощь приветствуется!

...