我一直在应用程序中使用领域,我很喜欢它。谢谢您!我有一个问题想和你们谈谈,听听你们的建议。
假设您有一个包含日期字段的领域对象(简化示例):

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。
首先,您不需要手动保持AppointmentAppointmentsInWeek同步。您可以使用object propertieslist propertieslinking objects properties的组合来建模Appointments和AppointmentsInWeeks之间的连接。具体如何实现这取决于应用程序的特定需求,但有一种可能性:

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/

10-11 14:43