Group Array 用于在 Swift 中引入 UITableView 的各个部分



我有以下类:

ChatMessage: Codable {
var id: Int?
var sender: User?
var message: String?
var seen: Int?
var tsp: Date?
}

tsp 的格式如下:YYYY-MM-DD hh:mm:ss

我想对同一天发送的消息进行"分组",最终得到如下例所示的内容:

let groupedMessages = [ [ChatMessage, ChatMessage], [ChatMessage, ChatMessage, ChatMessage] ]

我最终想在UITableViewController中使用groupedMessages来引入如下部分:

func numberOfSections(in tableView: UITableView) -> Int {
return groupedMessages.count 
// would be 2 int the above
}

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return chatMessages[section].count 
// would be 2 for the first and 3 for the second section
}

完成排序的最高性能方法是什么? - 即一旦要排序的聊天消息数量增加,它也能很好地工作

你可以试试:

let cal = Calendar.current
let groupedMessages = Dictionary(grouping: self.chatMessages, by: { cal.startOfDay($0.tsp) })
let keys = groupedMessages.keys.sorted(by: { $0 > $1 })

但是,这将为您提供一个字典,例如:

[
SomeDateHere: [
ChatMessage(id: 0, sender: User?, message: "String", seen: 1),
ChatMessage(id: 0, sender: User?, message: "String", seen: 1)
],
AnotherDateHere: [
ChatMessage(id: 0, sender: User?, message: "String", seen: 1)
]

然后,您可以使用键返回节计数:

return keys.count

并获取每个字典项的消息数组,如下所示:

let key = keys[indexPath.section]
let messages = groupedMessages[key].sorted(by: { $0.tsp > $1.tsp })

或者只得到计数:

let key = keys[indexPath.section]
return groupedMessages[key].count

按日期对数组进行分组,您可以在这里找到 如何在 swift 中按日期对对象数组进行分组?

如何将其连接到UITableView,您将在此处找到 https://www.ralfebert.de/ios-examples/uikit/uitableviewcontroller/grouping-sections/

我可能会从引入一个新类型开始:

public struct CalendarDay: Hashable {
public let date: Date
public init(date: Date = Date()) {
self.date = Calendar.current.startOfDay(for: date)
}
}
extension CalendarDay: Comparable {
public static func < (lhs: CalendarDay, rhs: CalendarDay) -> Bool {
return lhs.date < rhs.date
}
}

然后我会扩展您的信息:

extension ChatMessage {
var day: CalendarDay {
return CalendarDay(date: tsp)
}
}

(我假设tsp不是可选的,没有理由让它是可选的(。

现在,让我们定义一个部分:

struct Section {
var messages: [ChatMessage] = []
let day: CalendarDay
init(day: CalendarDay) {
self.day = day
}
}

让我们轻松分组:

let messages: [ChatMessage] = ...
var sections: [CalendarDay: Section] = [:]
for message in messages {
let day = message.day
var section = sections[day] ?? Section(day: day)
section.messages.append(day)
sections[day] = section
}
let sectionList = Array(sections.values).sorted { $0.day < $1.day }

如果邮件最初未排序,则可能还需要对每个部分中的邮件进行单独排序。

let testArray = ["2016-06-23 09:07:21", "2016-06-23 08:07:21", "2016-06-22 09:07:21", "2016-06-22 08:07:21"]
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "YYYY-MM-DD hh:mm:ss"
let groupDic = Dictionary(grouping: testArray) { (pendingCamera) -> DateComponents in
let date = Calendar.current.dateComponents([.day, .year, .month], from: dateFormatter.date(from: pendingCamera)!)
return date
}
print(groupDic)

您可以获取 groupDic 并返回 numberOfSections 和 titleForHeaderInSection。

最新更新