我一直在应用程序中使用领域,我很喜欢它。谢谢您!我有一个问题想和你们谈谈,听听你们的建议。
假设您有一个包含日期字段的领域对象(简化示例):
class Appointment: Object {
dynamic var type = ""
dynamic var date = Date()
}
现在,假设您已经保存了数千个约会,并且您将在TableView或CollectionView上显示这些约会,例如,按周分组。所以视图的数据源应该是这样的。
struct AppointmentsInWeek {
var startDate: Date?
var endDate: Date?
var appointments: [Appointment]
}
因此,我有两个选择,我正在考虑各种利弊:
γ
a)使
AppointmentsInWeek
成为Object
的子类,将其保存在领域中,并将其用作数据源。赞成的意见:
表的数据将从领域延迟加载
在需要的时候使用简单。
欺骗:
保持这个更新看起来是一个挑战。我可能会在领域中看到一些可观察到的
Appointment
,当任何一个被添加到适当的AppointmentWeek
中时。b)加载带有TableView的屏幕后,获取所有约会或其中的一个子集,按相应的开始和结束日期对其分组,并创建一个
AppointmentsInWeek
结构用作数据源。赞成的意见:
AppointmentsInWeek
将始终是最新的,因为它是根据需要即时创建的。欺骗:
我们必须记住所有这些,限制我们可以立即实际显示的约会数量。
我从选项B开始,但我现在想最好还是选择选项A。如果我这样做,最大的问题是确保在添加新约会时领域始终是最新的。
问题
还有其他我没有考虑的选择吗?
哪一个听起来更好?
假设我使用选项A,是否有一个类,它在应用程序的整个生命周期中一直存在,负责观察领域中的
Appointments
并且当添加(或更改)一个类时,也将其添加到适当的AppointmentWeek
中? 最佳答案
两种选择都可以,但我建议选择A。有几种方法可以接近选择A。
首先,您不需要手动保持Appointment
和AppointmentsInWeek
同步。您可以使用object properties、list properties和linking objects properties的组合来建模Appointment
s和AppointmentsInWeek
s之间的连接。具体如何实现这取决于应用程序的特定需求,但有一种可能性:
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>()
}
第二种可能是根本不使用关系,而是使用查询。领域支持通过
Results
类进行查询。您可以在AppointmentsInWeek
类中添加一个忽略的属性,该属性查询域中属于其日期范围的所有约会: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"]
}
}
在这两种情况下,只要线程的运行循环(通常是主线程)运行,域、列表和结果都会自动更新。领域还支持各种notifications以防您需要手动响应更改。
关于swift - 我应该为自定义分组创建单独的Realm对象吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43278533/