领域列表和 Swift 数组
Realm Lists and Swift Arrays
我想使用 Realm 来持久化数据,因为它似乎比 Core Data 更容易学习和使用。
然而,有些方面我仍然不清楚,其中之一是使用领域列表。
例如我现在有这样的东西:
class Foo {
var a: String
var b: [Bar]
var average: Double {
return Double(b.reduce(0.0, combine: {[=11=] + .c})) / Double(b.count);
}
//...
}
class Bar {
var c: Float
var d: NSDate
//...
}
据我了解,我需要在 Swift Array
上使用 Realm List
才能使 "to-many relationships".
除了计算平均值(如代码中所示)之外,我还使用 foo.b
数组来填充表视图和一些 for in
循环。我还将它映射到其他数组并使用它的 filter()
函数。
现在,我应该只使用 Realm List
还是应该将它映射到原生 Swift Array 然后改用它(为了性能和简单的原因)?
一般建议是,除非必要,否则应避免从 List<T>
转换为 [T]
。这有两个原因:
List<T>
是数据的实时视图,而不是时间点快照。
List<T>
可以避免为许多计算实例化 T
s。
实时取景
List<T>
个实例提供对数据的实时视图,而不是时间点快照。您可以将一个交给视图控制器,它的内容将在应用程序的其他部分更新它包含的对象后更新。
效率
List<T>
及其提供的方法,在很多情况下可以避免T
实例化。例如,您可以使用 NSPredicate
过滤 List
,而 Realm 不需要为此在内存中创建 Swift 对象。另一种情况是您示例中的 average
计算 属性 。它可以这样写(假设 b
现在是 List<Bar>
):
var average: Double {
return b.average("c") as Double?
}
这将计算 Realm 中基础值的平均值,而不具体化 Bar
个实例。
我想使用 Realm 来持久化数据,因为它似乎比 Core Data 更容易学习和使用。
然而,有些方面我仍然不清楚,其中之一是使用领域列表。
例如我现在有这样的东西:
class Foo {
var a: String
var b: [Bar]
var average: Double {
return Double(b.reduce(0.0, combine: {[=11=] + .c})) / Double(b.count);
}
//...
}
class Bar {
var c: Float
var d: NSDate
//...
}
据我了解,我需要在 Swift Array
上使用 Realm List
才能使 "to-many relationships".
除了计算平均值(如代码中所示)之外,我还使用 foo.b
数组来填充表视图和一些 for in
循环。我还将它映射到其他数组并使用它的 filter()
函数。
现在,我应该只使用 Realm List
还是应该将它映射到原生 Swift Array 然后改用它(为了性能和简单的原因)?
一般建议是,除非必要,否则应避免从 List<T>
转换为 [T]
。这有两个原因:
List<T>
是数据的实时视图,而不是时间点快照。List<T>
可以避免为许多计算实例化T
s。
实时取景
List<T>
个实例提供对数据的实时视图,而不是时间点快照。您可以将一个交给视图控制器,它的内容将在应用程序的其他部分更新它包含的对象后更新。
效率
List<T>
及其提供的方法,在很多情况下可以避免T
实例化。例如,您可以使用 NSPredicate
过滤 List
,而 Realm 不需要为此在内存中创建 Swift 对象。另一种情况是您示例中的 average
计算 属性 。它可以这样写(假设 b
现在是 List<Bar>
):
var average: Double {
return b.average("c") as Double?
}
这将计算 Realm 中基础值的平均值,而不具体化 Bar
个实例。