iOS Swift - 如何获取数组的最后一项并将其附加到另一个数组以获取聊天消息
iOS Swift - How to get the last items of an array and append it to another array for chat messages
我有以下代码(对每 20 秒触发一次的函数的 Parse Server 查询,并检查 Messages class 中是否有新行( table)):
/* 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
所以,我需要的是简单地将 messagesArray
的 2 个新项目追加到 theMessages
数组中,这样当我的 TableView 重新加载时,它只会添加 2 个新项目底部的行。
显然,由于这段代码,现在我又收到了前 2 条消息:
for i in 0..<messDiff {
self.theMessages.append(self.messagesArray[i])
}// ./ For
我不知道 'workaround' 我应该用什么来实现我需要的...
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()}
将您的代码重新加载数据代码更改为此
当你重新加载整个 table 视图时无论如何都没有动画为什么不简单地
self.theMessages = self.messagesArray
self.messagesTableView.reloadData()
或者如果新消息可靠地位于数组的末尾,则使用 suffix
获取它们并将它们附加到 theMessages
let newMessages = Array(self.messagesArray.suffix(messDiff))
self.theMessages.append(contentsOf: newMessages)
我有以下代码(对每 20 秒触发一次的函数的 Parse Server 查询,并检查 Messages class 中是否有新行( table)):
/* 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
所以,我需要的是简单地将 messagesArray
的 2 个新项目追加到 theMessages
数组中,这样当我的 TableView 重新加载时,它只会添加 2 个新项目底部的行。
显然,由于这段代码,现在我又收到了前 2 条消息:
for i in 0..<messDiff {
self.theMessages.append(self.messagesArray[i])
}// ./ For
我不知道 'workaround' 我应该用什么来实现我需要的...
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()}
将您的代码重新加载数据代码更改为此
当你重新加载整个 table 视图时无论如何都没有动画为什么不简单地
self.theMessages = self.messagesArray
self.messagesTableView.reloadData()
或者如果新消息可靠地位于数组的末尾,则使用 suffix
获取它们并将它们附加到 theMessages
let newMessages = Array(self.messagesArray.suffix(messDiff))
self.theMessages.append(contentsOf: newMessages)