我的聊天数据已成功插入firebase,但我无法将数据提取到指定的聊天室

时间:2016-08-03 02:32:51

标签: swift firebase firebase-realtime-database jsqmessagesviewcontroller

我目前正在关注zero2launches聊天应用程序,我还在YouTube上观看/完成了他们的其他教程。当我启动聊天应用程序时,我考虑将聊天部分从tableViewController更改为JSQMessageViewController。在这方面,我可以将数据发布到firebase,但它不会显示在各个聊天室中。

以下是代码:

var roomId: String!
var messages = [JSQMessage]()
func observeMessage() {
        messageRef.observeEventType(.ChildAdded, withBlock: { snapshot in
            //print(snapshot.value)
            if let dict = snapshot.value as? [String: AnyObject] {
                let mediaType = dict["MediaType"] as! String
                let senderId = dict["senderId"] as! String
                let senderName = dict["senderName"] as! String

                switch mediaType {
                    case "TEXT":
                        let text = dict["text"] as? String
                        self.messages.append(JSQMessage(senderId: senderId, displayName: senderName, text: text))
                    case "PHOTO":
                        let fileUrl = dict["fileUrl"] as! String
                        let url = NSURL(string: fileUrl)
                        let data = NSData(contentsOfURL: url!)
                        let picture = UIImage(data: data!)
                        let photo = JSQPhotoMediaItem(image: picture)
                        self.messages.append(JSQMessage(senderId: senderId, displayName: senderName, media: photo))
                    case "VIDEO":
                        let fileUrl = dict["fileUrl"] as! String
                        let video = NSURL(string: fileUrl)
                        let videoItem = JSQVideoMediaItem(fileURL: video, isReadyToPlay: true)
                        self.messages.append(JSQMessage(senderId: senderId, displayName: senderName, media: videoItem))
                default:
                    print("unknow data type")
                }

                if mediaType == "TEXT" {
                    let text = dict["text"] as? String
                    self.messages.append(JSQMessage(senderId: senderId, displayName: senderName, text: text))

                }else if mediaType == "PHOTO" {
                    let fileUrl = dict["fileUrl"] as! String
                    let url = NSURL(string: fileUrl)
                    let data = NSData(contentsOfURL: url!)
                    let picture = UIImage(data: data!)
                    let photo = JSQPhotoMediaItem(image: picture)
                    self.messages.append(JSQMessage(senderId: senderId, displayName: senderName, media: photo))

                }else if mediaType == "VIDEO" {

                    let fileUrl = dict["fileUrl"] as! String
                    let video = NSURL(string: fileUrl)
                    let videoItem = JSQVideoMediaItem(fileURL: video, isReadyToPlay: true)
                    self.messages.append(JSQMessage(senderId: senderId, displayName: senderName, media: videoItem))
                }
                print(dict)

                let text = dict["text"] as? String
                    self.messages.append(JSQMessage(senderId: senderId, displayName: senderName, text: text))
            self.collectionView.reloadData()
            }
        })
    }

    override func didPressSendButton(button: UIButton!, withMessageText text: String!, senderId: String!, senderDisplayName: String!, date: NSDate!) {
        let newMessage = messageRef.childByAutoId()

        let messageData = ["text": text, "senderId": senderId, "senderName": senderDisplayName, "MediaType": "TEXT"]

        newMessage.setValue(messageData)


    }

    override func didPressAccessoryButton(sender: UIButton!) {
        print("didPressAccessoryButton")
        let sheet = UIAlertController(title: "Media Messages", message: "Please select a media", preferredStyle: UIAlertControllerStyle.ActionSheet)
        let cancel = UIAlertAction(title: "Cancel", style: UIAlertActionStyle.Cancel) { (alert:UIAlertAction) in

        }

        let photoLibrary = UIAlertAction(title: "Photo Library", style: UIAlertActionStyle.Default) { (alert: UIAlertAction) in
            self.getMediaFrom(kUTTypeImage)
        }

        let videoLibrary = UIAlertAction(title: "Video Library", style: UIAlertActionStyle.Default) { (alert: UIAlertAction) in
            self.getMediaFrom(kUTTypeMovie)
        }
        sheet.addAction(photoLibrary)
        sheet.addAction(videoLibrary)
        sheet.addAction(cancel)
        self.presentViewController(sheet, animated: true, completion: nil)

    }

    func getMediaFrom(type: CFString) {
        print(type)
        let mediaPicker = UIImagePickerController()
        mediaPicker.delegate = self
        mediaPicker.mediaTypes = [type as String]
        self.presentViewController(mediaPicker, animated: true, completion: nil)
    }

    override func collectionView(collectionView: JSQMessagesCollectionView!, messageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageData! {
        return messages[indexPath.item]
    }

    override func collectionView(collectionView: JSQMessagesCollectionView!, messageBubbleImageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageBubbleImageDataSource! {
        let bubbleFactory = JSQMessagesBubbleImageFactory()
        return bubbleFactory.outgoingMessagesBubbleImageWithColor(.blackColor())
    }

    override func collectionView(collectionView: JSQMessagesCollectionView!, avatarImageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageAvatarImageDataSource! {
        return nil
    }

    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        print("number of item:\(messages.count)" )
        return messages.count
    }

    override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = super.collectionView(collectionView, cellForItemAtIndexPath: indexPath) as! JSQMessagesCollectionViewCell
        return cell
    }

    override func collectionView(collectionView: JSQMessagesCollectionView!, didTapMessageBubbleAtIndexPath indexPath: NSIndexPath!) {
        print("didTapMessageBubbleAtIndexPath: \(indexPath.item)")
        let message = messages[indexPath.item]
        if message.isMediaMessage {
            if let mediaItem = message.media as? JSQVideoMediaItem {
            let player = AVPlayer(URL: mediaItem.fileURL)
            let playerViewController = AVPlayerViewController()
                playerViewController.player = player
            self.presentViewController(playerViewController, animated: true, completion: nil)
            }
        }
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func sendMedia(picture: UIImage?, video: NSURL?) {
        print(picture)
        FIRStorage.storage().reference()
        if let picture = picture {
        let filePath = "\(FIRAuth.auth()?.currentUser!)\(NSDate.timeIntervalSinceReferenceDate())"
        print(filePath)
        let data = UIImageJPEGRepresentation(picture, 0.1)
        let metadata = FIRStorageMetadata()
        metadata.contentType = "image/jpg"
        FIRStorage.storage().reference().child(filePath).putData(data!, metadata: metadata) { (metadata, error) in
            if error != nil {
                print(error?.localizedDescription)
                return
            }

           let fileUrl = metadata!.downloadURLs![0].absoluteString
            let newMessage = self.messageRef.childByAutoId()

            let messageData = ["fileUrl": fileUrl, "senderId": self.senderId, "senderName": self.senderDisplayName, "MediaType": "PHOTO"]

            newMessage.setValue(messageData)

            }
        }else if let video = video {
            let filePath = "\(FIRAuth.auth()?.currentUser!)\(NSDate.timeIntervalSinceReferenceDate())"
            print(filePath)
            let data = NSData(contentsOfURL: video)
            let metadata = FIRStorageMetadata()
            metadata.contentType = "video/mp4"
            FIRStorage.storage().reference().child(filePath).putData(data!, metadata: metadata) { (metadata, error) in
                if error != nil {
                    print(error?.localizedDescription)
                    return
                }

                let fileUrl = metadata!.downloadURLs![0].absoluteString
                let newMessage = self.messageRef.childByAutoId()

                let messageData = ["fileUrl": fileUrl, "senderId": self.senderId, "senderName": self.senderDisplayName, "MediaType": "VIDEO"]

                newMessage.setValue(messageData)

            }

        }
    }
}

这是我现有的消息数据库功能

    let roofRef = FIRDatabase.database().reference()

class DataService {


    static let dataService = DataService()

    private var _BASE_REF = roofRef

    private var _ROOM_REF = roofRef.child("captions")

    private var _MESSAGE_REF = roofRef.child("messages")

    private var _PEOPLE_REF = roofRef.child("people")

    var currentUser: FIRUser? {
        return FIRAuth.auth()!.currentUser!
    }

    var BASE_REF: FIRDatabaseReference {
        return _BASE_REF
    }

    var ROOM_REF: FIRDatabaseReference {
        return _ROOM_REF
    }

    var MESSAGE_REF: FIRDatabaseReference {
        return _MESSAGE_REF
    }

    var PEOPLE_REF: FIRDatabaseReference {
        return _PEOPLE_REF
    }

    var storageRef: FIRStorageReference {
        return FIRStorage.storage().reference()
    }

    var fileUrl: String!

    func CreateNewPost(user: FIRUser, caption: String, data: NSData) {
        let filePath = "\(user.uid)/\(Int(NSDate.timeIntervalSinceReferenceDate()))"
        let metaData = FIRStorageMetadata()
        metaData.contentType = "image/jpg"
        storageRef.child(filePath).putData(data, metadata: metaData, completion: { (metadata, error) in
            if let error = error{
                print("Error uploarding: \(error.description)")
                return
            }
            self.fileUrl = metadata!.downloadURLs![0].absoluteString
            if let user =  FIRAuth.auth()?.currentUser {
                let idCaption = self.BASE_REF.child("captions").childByAutoId()
                idCaption.setValue(["caption": caption, "thumbnailURLFromStorage": self.storageRef.child(metadata!.path!).description, "filelUrl": self.fileUrl])
            }
        })

    }
func SignUp(username: String, email: String, password: String, data: NSData) {
        FIRAuth.auth()?.createUserWithEmail(email, password: password, completion: { (user, error) in
            if let error = error {
                print(error.localizedDescription)
                return
            }
            let changeRequest = user?.profileChangeRequest()
            changeRequest?.displayName = username
            changeRequest?.commitChangesWithCompletion({ (error) in
                if let error = error {
                    print(error.localizedDescription)
                    return
                }
            })
            let filePath = "profileImage/\(user!.uid)"
            let metadata = FIRStorageMetadata()
            metadata.contentType = "image/jpeg"

            self.storageRef.child(filePath).putData(data, metadata: metadata, completion: { (metadata, error) in
                if let error = error {
                    print("\(error.description)")
                    return
                }
                self.fileUrl = metadata?.downloadURLs![0].absoluteString
                let changeRequestPhoto = user!.profileChangeRequest()
                changeRequestPhoto.photoURL = NSURL(string: self.fileUrl)
                changeRequestPhoto.commitChangesWithCompletion({ (error) in
                    if let error = error {
                        print(error.localizedDescription)
                        return
                    }else{
                        print("profile updated")
                    }

                })
                self.PEOPLE_REF.child((user?.uid)!).setValue(["username": username, "email": email, "profileImage": self.storageRef.child((metadata?.path)!).description])


                ProgressHUD.showSuccess("Succeeded.")
                let appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
                appDelegate.login()
            })

        })

    }


    //implement login func

    func login(email: String, password: String) {
        FIRAuth.auth()?.signInWithEmail(email, password: password, completion: { (user, error) in
            if let error = error {
                print(error.localizedDescription)
                return
            }
        ProgressHUD.showSuccess("Succeeded")
            let appDelegate: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
            appDelegate.login()
        })
    }

    // Update profile

    func SaveProfile(username: String, email: String, data: NSData) {
        let user = FIRAuth.auth()?.currentUser!
        let filePath = "\(user!.uid)/\(Int(NSDate.timeIntervalSinceReferenceDate()))"
        let metaData = FIRStorageMetadata()
        metaData.contentType = "image/jpg"
        self.storageRef.child(filePath).putData(data, metadata: metaData) { (metaData, error) in
            if let error = error {
                print("Error uploading: \(error.description)")
                return
            }
            self.fileUrl = metaData!.downloadURLs![0].absoluteString
            let changeRequestProfile = user?.profileChangeRequest()
            changeRequestProfile?.photoURL = NSURL(string: self.fileUrl)
            changeRequestProfile?.displayName = username
            changeRequestProfile?.commitChangesWithCompletion({ (error) in
                if let error = error {
                print(error.localizedDescription)
                    ProgressHUD.showError("NetWork error")
                }else{

                }
                })
            if let user = user {
                user.updateEmail(email, completion: { (error) in
                    if let error = error {
                        print(error.description)
                    }else{
                        print("email update")
                    }
                })
            }
            ProgressHUD.showSuccess("Saved")
        }
    }
func CreateNewMessage(userId: String, roomId: String, textMessage: String) {
            let idMessage = roofRef.child("messages").childByAutoId()
           DataService.dataService.MESSAGE_REF.child(idMessage.key).setValue(["message": textMessage, "senderId": userId])
            DataService.dataService.ROOM_REF.child(roomId).child("messages").child(idMessage.key).setValue(true)
        }

        func fetchMessageFromServer(roomId: String, callback: (FIRDataSnapshot) -> ()) {
            DataService.dataService.ROOM_REF.child(roomId).child("messages").observeEventType(.ChildAdded, withBlock: {snapshot -> Void in
                DataService.dataService.MESSAGE_REF.child(snapshot.key).observeEventType(.Value, withBlock: {
                    snap -> Void in
                    callback(snap)
                })
            })
        }

0 个答案:

没有答案