【问题标题】:iOS Swift - How to get the last items of an array and append it to another array for chat messagesiOS Swift - 如何获取数组的最后一项并将其附加到另一个数组以获取聊天消息
【发布时间】:2019-09-29 00:47:02
【问题描述】:

我有以下代码(解析服务器查询到一个函数,该函数每 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 秒后,一个 Timer 调用上面的函数,我显然在控制台中得到了这个:

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

所以,我需要简单地将messagesArray 的2 个新项目附加到theMessages 数组中,这样当我的TableView 重新加载时,它只会在其底部添加2 个新行。

显然,由于这段代码,我现在再次收到前 2 条消息:

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

我不知道应该使用什么“解决方法”来实现我的需要...

【问题讨论】:

  • 您是否考虑过使用self.theMessages.insert(messages),然后改用tableView.insertRows
  • 好的,但我仍然需要从“messagesArray”中获取最后两条消息,所以我的问题是只获取它们并将它们附加到我的新数组(theMessages)中......

标签: arrays swift uitableview chat


【解决方案1】:

既然您正在重新加载整个表格视图而没有动画,为什么不简单地

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

或者,如果新消息可靠地位于数组末尾,则使用suffix 获取它们并将它们附加到theMessages

let newMessages = Array(self.messagesArray.suffix(messDiff))
self.theMessages.append(contentsOf: newMessages)

【讨论】:

    【解决方案2】:
    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()}
    

    将您的代码重新加载数据代码更改为此

    【讨论】:

    • 谢谢,虽然我已经添加了这些行:'let indexP = IndexPath(row: i+temp, section: 0)' 'self.messagesTableView.insertRows(at: [indexP], with: .fade)' 并删除了 'self.messagesTableView.reloadData()',这样我就可以在 ne 行上获得淡入淡出动画
    猜你喜欢
    • 2017-07-19
    • 2018-10-09
    • 2021-02-07
    • 2015-05-30
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多