swift - 我应该为自定义分组创建一个单独的 Realm 对象吗?

标签 swift realm

我一直在一个应用程序中使用 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 始终是最新的。

问题

  1. 还有其他我没有考虑的选择吗?
  2. 哪个听起来更好?
  3. 假设我选择选项 A,是否有一个类在应用程序的整个生命周期中存在,负责观察 Realm 中的 Appointments 以及何时添加(或已更改),也将其添加到适当的 AppointmentWeek?

最佳答案

两个选项都可以,但我建议选项 A。有几种方法可以接近选项 A。

首先,您不需要手动保持 AppointmentAppointmentsInWeek 同步。您可以使用 object properties 的某种组合, list properties , 和 linking objects propertiesAppointmentAppointmentsInWeek 之间的连接建模。具体如何实现取决于您应用的具体需求,但有一种可能性:

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/

相关文章:

ios - 如何通过自动布局以编程方式添加 InputAccessoryView?

arrays - 从indexpath.row中的数组获取特定值

swift - Realm 写入使 NSColorPanel 滞后

swift - 在 Chat App 中为每个用户创建 Realm DB

ios - Realm swift : Invalid value for property on xCode 9

ios - 在 Realm 中进行大规模更新的首选方法?

ios - 更新 Kinvey 上的现有用户

ios - Swift 如何在标签中的文本周围添加背景颜色?

iOS - 不能是连续或重复数字的 4 位整数的正则表达式?

android - 从 Android 中的另一个线程进行 Retrofit 和 Realm 访问