2015-12-24 43 views
3

我正在使用JSQMessageviewcontroller創建使用解析的聊天室。除了「我發送的消息在jsqmessage數組中添加了兩次」以外,我已經取得了一些成功。 Althuogh我已經檢查過,如果JSQMessage數組已經包含該消息,則不應該添加該消息,但在發送消息的情況下該條件爲false。在JSQMessageViewController中添加了兩次發送的消息

這裏是我的代碼:

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

    } 

} 
} 

會很感激,如果任何人都可以提供幫助。提前致謝。

+0

你應該檢查的東西更獨特的jsqMessage比只是實例,因爲它可能只檢查指針是否相等,而不是數值是否相同。嘗試檢查散列屬性以查看2條消息是否相同 – bolnad

+0

如何檢查散列屬性?我不知道。你可以請我嗎? –

+0

你能告訴我你是怎麼解決這個問題的? –

回答

0

有一種方法可以在JSQMessageData協議上實現,名爲messageHash。它返回一個Int,它意味着每個消息都是唯一的ID。您應該可以使用它來檢查並查看消息是否相同。

您需要創建附着於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對象數據類,雖然我不是非常熟悉,可以解析告訴你是否可能,但你真的只重新映射現有的屬性是新的名稱,所以它不應該是一個問題

+0

謝謝你的這種行爲。我非常感謝你的幫助。肯定會嘗試這種方式。 –

+0

當然沒問題,希望有幫助 – bolnad

+0

Hello Bolnad!我嘗試了上面的代碼,但不能以解決方案結束。可能是我不知道如何使用JSQMessageData協議。你能幫我使用我的上面的代碼。我會很感激。 –