I am designing a chat application in iOS swift. I use a UICollectionView to display the chat messages. The problem I have has to do with sending messages. Currently I use the following code: 
func handleSend() {
    if (inputTextField.text!.characters.count > 0) {
    sendButton.enabled = false
    let text = inputTextField.text
    inputTextField.text = ""
    print(inputTextField.text)
    let myUrl = NSURL(string: "http://****")
    let request = NSMutableURLRequest(URL:myUrl!);
    request.HTTPMethod = "POST";
    request.timeoutInterval = 10
    request.HTTPShouldHandleCookies=false
    if let user_id = NSUserDefaults.standardUserDefaults().stringForKey("userId") {
        let sender = user_id
        let chatID = self.chatId
        var postString = "sender=" + sender + "&chatID="
        postString = postString + chatID! + "&text=" + text!
        print(postString)
        request.HTTPBody = postString.dataUsingEncoding(NSUTF8StringEncoding);
        let task = NSURLSession.sharedSession().dataTaskWithRequest(request) {
            data, response, error in
            do {
                if (data != nil) {
                    do {
                        do {
                            let jsonArray = try NSJSONSerialization.JSONObjectWithData(data_fixed!, options:[])
                            if let errorToken = jsonArray["error"] as! Bool? {
                                if  !errorToken  {
                                    self.sendButton.enabled = true
                                    let newMessage = Message()
                                    newMessage.chat_ID = chatID
                                    self.chat_m.append(newMessage)
                                    let item = self.chat_m.count-1
                                    dispatch_async(dispatch_get_main_queue(), {
                                        let insertionAtIndexPath = NSIndexPath(forItem: item, inSection: 0)
                                            self.collectionView!.insertItemsAtIndexPaths([insertionAtIndexPath])
                                            self.collectionView!.scrollToItemAtIndexPath(insertionAtIndexPath, atScrollPosition: .Bottom, animated: true)
                                        self.inputTextField.text = nil
                                }
                                else {
                                    self.sendButton.enabled = tru
                                }
                            }
                            else {
                                self.sendButton.enabled = true
                            }
  }
          }
           task.resume()
    }
    }
    }
Now the problem with this is that the user must wait until his current message is sent until he can send the next one. What I would prefer to do is to immediately insert the message into the collectionView after the user hits the send button, and then upload it in the background. I could of course store an array of messages to be uploaded and then upload that every couple seconds, but I think that's a bit of a dirty solution; I would like to use a queue, such that the messages get pushed onto the queue and uploaded in the background, and as soon as one message gets uploaded, the next one uploads after it; but I'm not sure how to achieve this. 
