我一直在一个应用程序中使用 Realm,并且非常喜欢它。谢谢!我有一个问题想请教各位并获得一些建议。
假设您有一个包含日期字段的 Realm 对象(简化示例):
class Appointment: Object {
dynamic var type = ""
dynamic var date = Date()
}
现在,假设您已经保存了数千个约会,并且您将在表格 View 或 Collection View 中显示这些约会,例如按周分组。所以你的 View 的数据源应该是这样的。
struct AppointmentsInWeek {
var startDate: Date?
var endDate: Date?
var appointments: [Appointment]
}
因此,我考虑了两种选择,并考虑了各种利弊:
A) 使 AppointmentsInWeek
成为 Object
的子类,将其保存在 Realm 中,并将其用作数据源。
- 表的数据将从 Realm 延迟加载
- 在需要时易于使用。
- 保持最新状态似乎是一项挑战。我可能会对 Realm 中的
Appointment
进行某种观察,并将它们添加到适当的AppointmentWeek
B) 在使用 tableview 加载屏幕后,获取所有约会或其中的一部分,按适当的开始和结束日期对它们进行分组,并创建一个 AppointmentsInWeek
用作数据源的结构。
AppointmentsInWeek
将始终是最新的,因为它是根据需要即时创建的
- 我们必须将所有这些都保存在内存中,从而限制我们可以实际一次显示的约会数量。
我从选项 B 开始,但我现在认为选择选项 A 可能更好。如果我这样做,最大的问题是确保在添加新约会时 Realm 始终是最新的。
问题
- 还有其他我没有考虑的选择吗?
- 哪个听起来更好?
- 假设我选择选项 A,是否有一个类在应用程序的整个生命周期中存在,负责观察 Realm 中的
Appointments
以及何时添加(或已更改),也将其添加到适当的AppointmentWeek
?
最佳答案
两个选项都可以,但我建议选项 A。有几种方法可以接近选项 A。
首先,您不需要手动保持 Appointment
和 AppointmentsInWeek
同步。您可以使用 object properties 的某种组合, list properties , 和 linking objects properties为 Appointment
和 AppointmentsInWeek
之间的连接建模。具体如何实现取决于您应用的具体需求,但有一种可能性:
class Appointment : Object {
dynamic var type = ""
dynamic var date = NSDate()
// Link to the week this appointment lives in, if desired
var week: AppointmentsInWeek? = nil
}
class AppointmentsInWeek : Object {
dynamic var startDate = NSDate()
dynamic var endDate = NSDate()
// Add appointment to List whenever it's created
let appointments = List<Appointment>()
}
第二种可能性是根本不使用关系,而是使用查询。 Realm 支持通过 Results
查询类(class)。您可以在 AppointmentsInWeek
类上添加一个被忽略的属性,该类查询 Realm 以查找属于其日期范围内的所有约会:
class Appointment : Object {
dynamic var type = ""
dynamic var date = NSDate()
}
class AppointmentsInWeek : Object {
dynamic var startDate = NSDate()
dynamic var endDate = NSDate()
lazy var appointments: Results<Appointment> = {
// This implementation assumes you can get a reference
// to the Realm storing your Appointments somehow
return appointmentsRealm.objects(Appointments.self).filter(NSPredicate(format: "(date >= %@) AND (date < %@)", self.startDate, self.endDate))
}()
override static func ignoredProperties() -> [String] {
return ["appointments"]
}
}
无论哪种情况,每当它们所在线程(通常是主线程)的运行循环运行时, Realm 、列表和结果都会自动更新。 Realm 还支持多种 notifications以防您需要手动对更改使用react。
关于swift - 我应该为自定义分组创建一个单独的 Realm 对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43278533/