投射

open class Projection<Root> : RealmCollectionValue, ProjectionObservable where Root : RLMObjectBase, Root : RealmCollectionValue, Root : ThreadConfined
extension Projection: KeypathSortable
extension Projection: ThreadConfined where Root: ThreadConfined
extension Projection: ObservableObject, RealmSubscribable where Root: ThreadConfined

Projection 是原始 Realm ObjectEmbeddedObject的轻量级模型。 您可以使用Projection作为视图模型,以尽量减少样板文件。

使用示例:

public class Person: Object {
    @Persisted var firstName = ""
    @Persisted var lastName = ""
    @Persisted var address: Address?
    @Persisted var friends: List<Person>
    @Persisted var reviews: List<String>
}

public class Address: EmbeddedObject {
    @Persisted var city: String = ""
    @Persisted var country = ""
}

class PersonProjection: Projection<Person> {
    @Projected(\Person.firstName) var firstName
    @Projected(\Person.lastName.localizedUppercase)
    var lastNameCaps
    @Projected(\Person.address.city) var homeCity
    @Projected(\Person.friends.projectTo.firstName)
    var friendsFirstName: ProjectedCollection<String>
}

### 支持的属性类型

投影可通过多种方式转换原始@Persisted属性:

  • Passthrough - Projection的属性将具有与原始对象相同的名称和类型。 请参阅PersonProjection.firstName
  • Rename - 投影的属性将具有与原始对象相同的类型,只是具有新名称。
  • Keypath resolution — 您可以访问投影Object的某些属性。 请参阅PersonProjection.lastNameCapsPersonProjection.homeCity
  • Collection mappingList MutableSetObject或 的EmbeddedObject 和 可投影为原始值的collection。请参阅PersonProjection.friendsFirstName
  • Exclusion - 投影模型中未定义的原始 Realm 对象的所有属性都将从投影中排除。 对这些属性发生的任何更改都不会触发Projection的更改通知。 您仍然可以访问原始ObjectEmbeddedObject ,并直接在其上观察通知。

注意

@Persisted@Projected在同一 Projection 类中,每个属性都可以以不同的方式设为 。每个ObjectEmbeddedObject可以同时具有多个相同或不同类的投影。

查询

您可以通过调用 Realm 的objects(_:)或投影类的init(projecting:)来从 Realm 中检索给定类型的所有投影:

let projections = realm.object(PersonProjection.self)
let personObject = realm.create(Person.self)
let singleProjection = PersonProjection(projecting: personObject)

适用于以下位置: RootThreadConfined

  • 托管对象的 Realm,如果对象为非托管对象,则为nil 。 注意:只能为托管对象实例化投影,因此 Realm 永远不会为 nil。 非托管对象不仅限于线程,也不能传递给需要ThreadConfined对象的方法。

    声明

    Swift

    public var realm: Realm? { get }
  • 指示对象是否因现已无效而无法再访问。

    声明

    Swift

    public var isInvalidated: Bool { get }
  • 指示对象是否已冻结。 冻结对象不限于其源线程。 允许为冻结对象形成ThreadSafeReference ,但不太可能有用。

    声明

    Swift

    public var isFrozen: Bool { get }
  • 返回此对象的冻结快照。与普通 Realm 对象不同,冻结副本可以从任何线程读取,并且读取的值永远不会更新以反映对 Realm 的新写入。可以像查询任何其他 Realm 集合一样查询冻结集合。 冻结对象无法更改,也无法观察到变更通知。 非托管 Realm 对象无法被冻结。

    警告

    在 Realm 上执行写事务(write transaction)时长时间持有冻结对象可能会导致 Realm 文件变大。有关更多信息,请参阅Realm.Configuration.maximumNumberOfActiveVersions

    声明

    Swift

    public func freeze() -> Self
  • 返回此对象的实时(可变)引用。 如果在已经存在的对象上调用,则会返回 self。

    声明

    Swift

    public func thaw() -> `Self`?
  • 每次投影更改时发出 Void 的发布者。

    尽管有这个名称,但它实际上是在投影更改发出的。

    声明

    Swift

    public var objectWillChange: RealmPublishers.WillChange<Projection> { get }