отправленное сообщение добавлено дважды в 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, чтобы сообщить вам, возможно ли это или нет, но на самом деле вы только переопределяете существующие свойства как новые имена, поэтому это не должно быть проблемой

  • Xcode 8.2.1 / Swift 3 - загрузить TableView из массива пластин из словарей
  • Facebook iOS SDK: как обращаться с кнопкой SKIP при запросе публикации?
  • MFMessageComposeViewController не вызывает свой метод делегирования
  • iOS: полужирный и курсив на одном и том же слове
  • OcMock vs OcMockito - что за плюсы и минусы
  • Когда использовать didMoveToView или initWithSize с помощью SpriteKit в xCode 6.4
  • Xcode 8.3 - SourceKitService CPU 95% + нагрузки
  • Есть ли хороший учебник по автоматическому тестированию пользовательского интерфейса для какао-тросов?
  • Как я могу зарегистрировать идентификатор Touch в Simulator из командной строки?
  • Пытаться использовать NSDate только для времени
  • Ошибка Xcode 7 с командой /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swiftc не удалось с кодом выхода 1
  • Interesting Posts

    iOS Выбор текста Цвет увеличительного стекла?

    iOS Date Picker с днем ​​недели вместо полной даты

    Как установить расширения на React Native, установленные с Cocoapods?

    Автоматическое изменение размера в навигационной панели сегментированного элемента управления, построенного динамически

    Xcode 5 xcodebuild unit test, похоже, возвращает статус успешно при неудачных тестах

    Печать диаграммы shinobi в PDF

    Как я могу повторить образ шаблона для создания фона в React Native?

    CGAffineTransformMakeRotation перед CABasicAnimation

    Как установить систему шрифтов в iOS

    Невозможно включить шрифт .ttf в проект

    textFieldShouldEndEditing вызывается несколько раз

    Быстрая позиция значка UITextField

    Потоковое аудио: HTTP Live Streaming необходимо для одобрения магазина приложений?

    Как настроить высоту заголовка таблицы в swift?

    Используя API Google+ iOS, как войти в профиль пользователя?

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