如何按日期对邮件分组?

时间:2018-07-31 20:08:41

标签: ios swift uitableview sorting

比方说,我正在从数据库中获取消息(对象)。它们不是同时到达的,一条消息总是在任何时间到达(一条获取->一条消息;每条消息都会调用一个函数)。
每个消息都包含一个时间戳,代表创建消息的日期。因此,我可以致电message.date,然后我将获得创建消息的日期。 消息没有以任何顺序到达;创建的最后一条消息可能位于第三/第四/ ...位置。

我想按天对这些消息进行分组,以便将它们显示在UITableView中。 每个部分代表一天。每个部分的标题都包含日期,每个单元格都包含时间(类似于WhatsApp Messenger中的内容)。
我知道如何创建自定义标题视图,插入节,行等。
问题是我不知道如何或如何对消息进行排序以轻松创建TableView的数据类型 节省资源和效率(就存储要求和清晰度)。 如果我有一个二维数组,那将很容易,但是我不够聪明,无法想出一种有效的方法来对消息进行排序(或分组)。

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

时间戳是一个日期,因此请按日期(数组)和按天分组(字典)进行排序。

  • 按日期排序包含日期信息的数组是Swift中的一种方法。
  • 在Swift中,将包含日期信息的排序数组分组到按天为键的字典中也是一种方法。

这是两行代码,您无需更改任何内容。

但是,字典没有顺序,因此我建议采取第三步,将字典转换为一些反映表的表行结构的自定义结构的数组。用于 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
}