比方说,我正在从数据库中获取消息(对象)。它们不是同时到达的,一条消息总是在任何时间到达(一条获取->一条消息;每条消息都会调用一个函数)。
每个消息都包含一个时间戳,代表创建消息的日期。因此,我可以致电message.date
,然后我将获得创建消息的日期。
消息没有以任何顺序到达;创建的最后一条消息可能位于第三/第四/ ...位置。
我想按天对这些消息进行分组,以便将它们显示在UITableView
中。
每个部分代表一天。每个部分的标题都包含日期,每个单元格都包含时间(类似于WhatsApp Messenger中的内容)。
我知道如何创建自定义标题视图,插入节,行等。
问题是我不知道如何或如何对消息进行排序以轻松创建TableView的数据类型 节省资源和效率(就存储要求和清晰度)。
如果我有一个二维数组,那将很容易,但是我不够聪明,无法想出一种有效的方法来对消息进行排序(或分组)。
非常感谢您的帮助!
答案 0 :(得分:1)
时间戳是一个日期,因此请按日期(数组)和按天分组(字典)进行排序。
这是两行代码,您无需更改任何内容。
但是,字典没有顺序,因此我建议采取第三步,将字典转换为一些反映表的表行结构的自定义结构的数组。用于 any 分段表视图的正确数据源将具有以下结构:
struct Row {
// row properties
}
struct Section {
var rowData : [Row]
// section properties
}
var model : [Section]!
因此,在将字典作为分组方式之后,只需将其映射到Section数组上并保持向前即可。
当然,如果您没有 数据,并且数据一次到达一个项目,则可以省略上述两个项目符号步骤。只需从结构化模型开始,并在每件物品到达时将它们放入正确的位置即可。
编辑:您(在评论中)表示过对如何将元素插入已排序数组中正确位置的兴趣,因此,这里有一个示例(请参见https://stackoverflow.com/a/26679191/341994):< / p>
extension Array {
func insertionIndex(of elem: Element, by f: (Element, Element) -> Bool) -> Int {
var lo = 0
var hi = self.count - 1
while lo <= hi {
let mid = (lo + hi)/2
if f(self[mid], elem) {
lo = mid + 1
} else if f(elem, self[mid]) {
hi = mid - 1
} else {
return mid // found at position mid
}
}
return lo // not found, would be inserted at position lo
}
mutating func insertSorted(_ elem:Element, by f: (Element, Element) -> Bool) {
self.insert(elem, at:self.insertionIndex(of:elem, by:f))
}
}
这是一个测试;当然,您的排序功能不会像<
那样简单,但这实际上是唯一的区别:
var arr = [Int]()
arr.insertSorted(1, by:<)
arr.insertSorted(10, by:<)
arr.insertSorted(9, by:<)
arr.insertSorted(3, by:<)
arr.insertSorted(5, by:<)
arr.insertSorted(7, by:<)
arr.insertSorted(6, by:<)
// [1, 3, 5, 6, 7, 9, 10]
答案 1 :(得分:0)
您可以很容易地对其进行分组。 例如,消息包含以下内容:
struct message {
let senderName:String
let mess:String
let reciever:String
let time:Date
}
您会收到一些消息:
var messages = [message]()
messages.append(message(senderName: "snow", mess: "Hello", reciever: "Dani", time: Date(timeIntervalSince1970: 1533078663)))
messages.append(message(senderName: "john", mess: "Hello", reciever: "Dani", time: Date(timeIntervalSince1970: 1533078606)))
messages.append(message(senderName: "alix", mess: "Hello", reciever: "Dani", time: Date(timeIntervalSince1970: 1533078633)))
您可以使用以下方法轻松将其分组:
let groupedMessage = Dictionary(grouping: messages) { (mess) -> Date in
return mess.time
}