iOS Swift - Как получить последние элементы массива и добавить его в другой массив для сообщений чата - PullRequest
4 голосов
/ 11 мая 2019

У меня есть следующий код (запрос сервера Parse в функцию, которая запускается каждые 20 секунд и проверяет, есть ли новые строки в классе Messages (таблица)):

    /* Variables */
    var messagesArray = [PFObject]()
    var theMessages = [PFObject]()


    /* func queryMessages() code */
    let messId1 = "\(currentUser.objectId!)\(userObj.objectId!)"
    let messId2 = "\(userObj.objectId!)\(currentUser.objectId!)"

    let predicate = NSPredicate(format:"messageID = '\(messId1)' OR messageID = '\(messId2)'")
    let query = PFQuery(className: MESSAGES_CLASS_NAME, predicate: predicate)

    query.whereKey(MESSAGES_DELETED_BY, notContainedIn: [currentUser.objectId!])
    query.order(byAscending: "createdAt")
    query.skip = skip
    query.findObjectsInBackground { (objects, error)-> Void in
        if error == nil {
            for i in 0..<objects!.count { self.messagesArray.append(objects![i]) }
            if (objects!.count == 100) {
                self.skip = self.skip + 100
                self.queryMessages()
            } else {
                self.messagesArray = objects!


                /*test*/
                let messDiff = self.messagesArray.count - self.theMessages.count
                print("MESSAGES ARRAY: \(self.messagesArray.count)")
                print("THE MESSAGES: \(self.theMessages.count)")
                print("MESS DIFF: \(messDiff)\n")

                if self.theMessages.count < self.messagesArray.count {
                    for i in 0..<messDiff {
                        self.theMessages.append(self.messagesArray[i])
                    }// ./ For
                    self.messagesTableView.reloadData()
                }// ./ If

                // Scroll TableView down to the bottom
                if objects!.count != 0 {
                    Timer.scheduledTimer(timeInterval: 1.5, target: self, selector: #selector(self.scrollTableViewToBottom), userInfo: nil, repeats: false)
                }
            }// ./ If

        // error
        } else { self.simpleAlert("\(error!.localizedDescription)")
    }}

Итак, приложение работает на моем устройстве, и с другого устройства я отправляю 2 новых сообщения тестируемому пользователю на моем устройстве.Через 20 секунд таймер вызывает вышеописанную функцию, и я, очевидно, получаю это в консоли:

MESSAGES ARRAY: 9
THE MESSAGES: 7
MESS DIFF: 2

Итак, мне нужно просто добавить 2 новых элемента messagesArray в *Массив 1010 *, так что, когда мой TableView перезагрузится, он просто добавит 2 новые строки внизу.

Очевидно, теперь я получаю первые 2 сообщения снова из-за этого кода:

for i in 0..<messDiff {
    self.theMessages.append(self.messagesArray[i])
}// ./ For

Я не могу понять, какой «обходной путь» я должен использовать для достижения того, что мне нужно ...

Ответы [ 2 ]

3 голосов
/ 14 мая 2019

Поскольку вы в любом случае перезагружаете представление всей таблицы без анимации, почему бы не просто

self.theMessages = self.messagesArray
self.messagesTableView.reloadData()

Или если новые сообщения надежно находятся в конце массива, получите их с помощью suffix и добавьте их к theMessages

let newMessages = Array(self.messagesArray.suffix(messDiff))
self.theMessages.append(contentsOf: newMessages)
2 голосов
/ 14 мая 2019
if self.theMessages.count < self.messagesArray.count {
                let temp = self.theMessages.count
                for i in 0..<messDiff {
                    self.theMessages.append(self.messagesArray[i+temp])
                }// ./ For
                self.messagesTableView.reloadData()}

измените ваш код перезагрузки данных на этот

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...