Realm如何使用List <t>和RealmOptional <t>处理动态调度?

时间:2016-09-09 20:36:25

标签: swift realm

Realm依靠动态调度来访问某些KVC机制的ObjectiveC运行时。模型属性应使用dynamic关键字标记,以启用Realm个对象使用的KVC以使用精确值填充它们。所以你可以像这样定义模型:

class Car: Object {
    dynamic var color = ""
    dynamic var age = 0
}

在某种程度上,您可以设置如下属性:

var car = Car()
car["color"] = "white"
car["age"] = 20

这适用于所有基本类型,例如IntString但不适用于泛型类和结构,因为它们无法在Objective C中表示.Ereal使用两个那些类型:

  1. List<T>
  2. RealmOptional<T>
  3. 将这些类型的属性添加到R​​ealm模型时,可以添加它们而不使用动态关键字:

    let cars = List<Car>
    let registration = RealmOptional<String>
    

    Realm使用什么机制来设置和读取这些类型的数据而不使用动态调度?

    更新1

    经过一番检查,我发现Realm使用了一些Objective C运行时方法,如class_copyPropertyList()property_getName(),用于内省属性名称。我还没有发现当您从Realm读取数据时,如何使用正确的数据填充属性?那是ObjectStore C ++框架的一部分吗?

1 个答案:

答案 0 :(得分:1)

诸如List<T>RealmOptional<T>之类的通用属性无法从Objective-C中显示出来。 Realm使用Swift的反射(Mirror())来检查它们。

(见https://github.com/realm/realm-cocoa/blob/b71daecd0f4cf7a89fcb30178be02f506d9b3124/RealmSwift/Object.swift#L310-L316

然后直接访问他们的ivarhttps://github.com/realm/realm-cocoa/blob/76d1018b32ba98babce31afbefd31863075cde8c/Realm/RLMObjectSchema.mm#L217-L223

静态调度这些通用属性。 Realm无法访问那些。这就是为什么必须将这些属性声明为let的原因。领域无法看到重新分配属性。