Joh*_*ohn 5 objective-c realm ios
我有realm数据库,其中包含添加此数据的数据和日期.我想提取这个并将日期设置为表视图部分标题和数据,因为每个部分的行数据取决于日期.我知道如何exctract但不知道如何按日期分组并根据日期设置每个部分的数据.谢谢!
使用高阶函数而不是循环的 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)
您可以按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.