отправленное сообщение добавлено дважды в JSQMessageViewController

Я использую JSQMessageviewcontroller для создания чата с помощью синтаксического анализа. Я успешно выполняю все, кроме «Мое отправленное сообщение добавляется дважды в массив jsqmessage». Althuogh Я проверил, если массив JSQMessage уже содержит это сообщение, его не следует добавлять, но условие является ложным в случае отправленного сообщения.

Вот мой код:

import UIKit import JSQMessagesViewController import Parse class MessageViewController: JSQMessagesViewController { var chatWith : String? var chattingWith = false let incomingBubble = JSQMessagesBubbleImageFactory().incomingMessagesBubbleImageWithColor(UIColor(red: 10/255, green: 180/255, blue: 230/255, alpha: 1.0)) let outgoingBubble = JSQMessagesBubbleImageFactory().outgoingMessagesBubbleImageWithColor(UIColor.lightGrayColor()) var messages = [JSQMessage]() var updateTimer = NSTimer() let updateDelay = 2.0 var jsqMessages : [JSQMessage] = [] override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. self.setup() updateTimer = NSTimer.scheduledTimerWithTimeInterval(updateDelay, target: self, selector: "update", userInfo: nil, repeats: true) } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } override func viewDidDisappear(animated: Bool) { updateTimer.invalidate() } func reloadMessagesView() { self.collectionView?.reloadData() } } //MARK - Setup extension MessageViewController { func setup() { self.senderId = PFUser.currentUser()?.objectId! self.senderDisplayName = PFUser.currentUser()?.username! } } //MARK - Data Source extension MessageViewController { override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return self.messages.count } override func collectionView(collectionView: JSQMessagesCollectionView!, messageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageData! { let data = self.messages[indexPath.row] return data } override func collectionView(collectionView: JSQMessagesCollectionView!, didDeleteMessageAtIndexPath indexPath: NSIndexPath!) { self.messages.removeAtIndex(indexPath.row) } override func collectionView(collectionView: JSQMessagesCollectionView!, messageBubbleImageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageBubbleImageDataSource! { let data = messages[indexPath.row] switch(data.senderId) { case self.senderId: return self.outgoingBubble default: return self.incomingBubble } } override func collectionView(collectionView: JSQMessagesCollectionView!, avatarImageDataForItemAtIndexPath indexPath: NSIndexPath!) -> JSQMessageAvatarImageDataSource! { return nil } } //MARK - Toolbar extension MessageViewController { override func didPressSendButton(button: UIButton!, withMessageText text: String!, senderId: String!, senderDisplayName: String!, date: NSDate!) { let message = JSQMessage(senderId: PFUser.currentUser()?.objectId!, senderDisplayName: PFUser.currentUser()?.username!, date: date, text: text) print("sent messages = \(message)") if !self.messages.contains(message) { self.messages += [message] } self.sendMessageToParse(message , date: date) self.finishSendingMessage() } override func didPressAccessoryButton(sender: UIButton!) { } } //MARK - Syncano extension MessageViewController { func sendMessageToParse(message: JSQMessage , date : NSDate) { let obj = PFObject(className: "Chat") obj.setObject((PFUser.currentUser()?.username)!, forKey: "username") obj.setObject(message.text!, forKey: "Text") obj.setObject(chatWith!, forKey: "To") obj.setObject(PFUser.currentUser()!, forKey: "user") obj.setObject(date, forKey: "dateCreatedOn") try! obj.save() } func update() { let query = PFQuery(className: "Chat") query.limit = 10 query.includeKey("user") // query.whereKey("To", equalTo: chatWith!) query.findObjectsInBackgroundWithBlock { (results: [PFObject]?, error: NSError?) -> Void in for i in results! { if i.objectForKey("username") as? String == PFUser.currentUser()?.username! { let message = self.jsqMessageFromParseMessage(i, senderId: (PFUser.currentUser()?.objectId!)!, senderDisplayName: i.objectForKey("username")! as! String) print("received message : \(message)") self.jsqMessageArray(message) }else { let message = self.jsqMessageFromParseMessage(i, senderId: i.objectForKey("To")! as! String, senderDisplayName: i.objectForKey("To")! as! String) self.jsqMessageArray(message) } } } } func jsqMessageFromParseMessage(message: PFObject , senderId : String , senderDisplayName : String) -> JSQMessage { let jsqMessage = JSQMessage(senderId: senderId, senderDisplayName: senderDisplayName, date: message["dateCreatedOn"] as! NSDate, text: message["Text"] as! String) return jsqMessage } func jsqMessageArray(jsqmessage : JSQMessage){ if self.messages.contains(jsqmessage) { }else { // self.messages.append(jsqmessage) self.finishReceivingMessage() self.reloadMessagesView() } } } 

Будет очень признателен, если кто-то может помочь. Заранее спасибо.

One Solution collect form web for “отправленное сообщение добавлено дважды в JSQMessageViewController”

Существует метод, который можно реализовать в протоколе JSQMessageData, называемом messageHash. Он возвращает Int, и он предназначен для уникального идентификатора для каждого сообщения. Вы должны иметь возможность использовать это, чтобы проверять, совпадает ли сообщение или нет.

Вам нужно будет создать класс данных объекта, который придерживается протокола JSQMessageData, вместо использования JSQMessage

  class Message: JSQMessageData { func senderId()-> String { return //the result of currentUser()?.objectId } func senderDisplayName()-> String { return //the result of currentUser()?.username! } func date()-> NSDate { return // date } func isMediaMessage() -> Bool { return false } func messageHash()-> String { return //return a uniquely created id } func text()-> String { return // text } } 

Вы должны быть в состоянии сделать это на PFUser, хотя я недостаточно разбираюсь в Parse, чтобы сообщить вам, возможно ли это или нет, но на самом деле вы только переопределяете существующие свойства как новые имена, поэтому это не должно быть проблемой

  • ERROR ITMS-9000: неверный пакет. пакет в xyz.app не содержит исполняемого пакета
  • удалить ViewController с родительского экрана остается черным
  • Xcode 6.4 Приложение, которое вы выбрали, не существует
  • Как изменить тип Table View Controller на обычный контроллер просмотра?
  • Размер содержимого UITextView слишком короткий
  • Публичные заголовки Static Library не копируются в папку «Build / Products»
  • Изменить UIImage renderingMode из файла раскадровки / xib
  • Раскадровка Modal Segue с делегатом
  • Как создать статическую библиотеку и добавить файл .a в любой проект в ios
  • Как вы можете показать консоль отладчика в «xcode 6»,
  • Сообщение ERROR ITMS-90086, отправляющее приложение
  • Interesting Posts

    Можно ли настроить базовую линию в NSAttributedString?

    iPhone 5 – какое соглашение об именах должны иметь новые изображения?

    linphone_call_take_video_snapshot сохраненный пустой файл

    Видео как текстура для openGLES

    Создайте архитектуру armv6 (целевой iOS 3.1.3) с iOS 6 SDK и Xcode 4.5?

    UITableView tableFooterView может привести к сбою?

    Использование делегата для передачи информации с кнопки для выделения ячейки

    Прокрутите вверх страницы UITableView, коснувшись строки состояния

    Как заставить Captive Portal открыть браузер?

    iOS: Как включить настройки аудио на Картах Google

    как проверить полученное сообщение, прочитано или непрочитано в xmpp framework в ios

    Realm – Можно ли сохранить объект после удаления объекта?

    iAd не появляется после выпуска

    Получение текущего времени, когда устройство закрывается

    Как я могу измерить разбивку сетевого времени, проведенного в iOS?

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.