iOS Realm按日期分组到tableView部分

Joh*_*ohn 5 objective-c realm ios

我有realm数据库,其中包含添加此数据的数据和日期.我想提取这个并将日期设置为表视图部分标题和数据,因为每个部分的行数据取决于日期.我知道如何exctract但不知道如何按日期分组并根据日期设置每个部分的数据.谢谢!

Ond*_*cek 5

使用高阶函数而不是循环的 Swift 4实现。

class Item: Object {
  @objc dynamic var id: Int = 0
  @objc dynamic var date: Date = Date()
}

let realm = try! Realm()

// fetch all Items sorted by date
let results = realm.objects(Item.self).sorted(byKeyPath: "date", ascending: false)              

let sections = results
    .map { item in
        // get start of a day
        return Calendar.current.startOfDay(for: item.date)
    }
    .reduce([]) { dates, date in
        // unique sorted array of dates
        return dates.last == date ? dates : dates + [date]
    }
    .compactMap { startDate -> (date: Date, items: Results<Item>) in
        // create the end of current day
        let endDate = Calendar.current.date(byAdding: .day, value: 1, to: startDate)!
        // filter sorted results by a predicate matching current day
        let items = results.filter("(date >= %@) AND (date < %@)", startDate, endDate)
        // return a section only if current day is non-empty
        return items.isEmpty ? nil : (date: startDate, items: items)
    }
Run Code Online (Sandbox Code Playgroud)


mar*_*ius 3

您可以按Results日期对检索到的内容进行排序,然后在迭代时将它们分开,以便以分组/分层的方式访问它们。

class Person {
    dynamic var name = ""
    dynamic var date = NSDate()
}

let sortedObjects = realm.objects(Person).sorted("date")

var lastDate = objects.first?.date
let calendar = NSCalendar.currentCalendar()
var lastGroup = [Person]()
var groups = [[Person]]()

for element in sortedObjects {
    let currentDate = element.date
    let difference = calendar.components([.Year, .Month, .Day], fromDate: lastDate!, toDate: currentDate, options: [])
    if difference.year > 0 || difference.month > 0 || difference.day > 0 {
        lastDate = currentDate
        groups.append(lastGroup)
        lastGroup = [element]
    } else {
        lastGroup.append(element)
    }
}
groups.append(lastGroup)
Run Code Online (Sandbox Code Playgroud)

注意:这样,您需要将所有元素保留在内存中。如果这对您不起作用,根据您的用例,您可以只记住索引,您可以使用索引来访问检索到的Results.