プロジェクション

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 ObjectまたはEmbeddedObjectの軽量モデルです。 または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>
}

Atlas でサポートされているプロパティの型

プロジェクションは、元の@Persistedプロパティをいくつかの方法で変換できます。

  • Passthrough - Projectionのプロパティは、元のオブジェクトと同じ名前とタイプになります。 詳しくはPersonProjection.firstNameを参照してください。
  • Rename - プロジェクションのプロパティは、新しい名前を持つだけで元のオブジェクトと同じタイプになります。
  • Keypath resolution - プロジェクションされたObjectの特定のプロパティにアクセスできます。 詳しくは、 PersonProjection.lastNameCapsPersonProjection.homeCityを参照してください。
  • Collection mapping -List MutableSetまたはObject の とEmbeddedObject は、プリミティブ値のコレクションとしてプロジェクションできます。詳しくはPersonProjection.friendsFirstNameを参照してください。
  • Exclusion - プロジェクション モデルで定義されていない元の Realm オブジェクトのすべてのプロパティは、プロジェクションから除外されます。 これらのプロパティで変更が発生しても、Projection の変更通知はtriggerされません。 元のObjectまたはEmbeddedObjectに引き続きアクセスし、通知を直接確認できます。

注意

@Persistedプロパティは、同じプロジェクション クラス内で異なる方法で@Projectedになることができます。 各ObjectまたはEmbeddedObjectは、同じクラスまたは異なるクラスの複数のプロジェクションを一度に持つことができます。

クエリ

Realm から特定のタイプのすべてのプロジェクションを検索するには、Realm のobjects(_:)またはプロジェクションの クラスのinit(projecting:)を呼び出します。

let projections = realm.object(PersonProjection.self)
let personObject = realm.create(Person.self)
let singleProjection = PersonProjection(projecting: personObject)
  • プロジェクションされるオブジェクト

    宣言

    Swift

    public let rootObject: Root
  • 新しいプロジェクションを作成します。

    宣言

    Swift

    public required init(projecting object: Root)

    パラメーター

    object

    プロジェクトするオブジェクト。

Root : ThreadConfinedで利用可能

  • オブジェクトを管理する 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 で書込みトランザクションを実行中に固定されたオブジェクトを長時間保持すると、Realm ファイルのサイズが大きくなる可能性があります。 詳しくは、 Realm.Configuration.maximumNumberOfActiveVersionsを参照してください。

    宣言

    Swift

    public func freeze() -> Self
  • このオブジェクトのライブ(可変)参照を返します。 すでに存在するオブジェクトで呼び出される場合は、自分自身を返します。

    宣言

    Swift

    public func thaw() -> `Self`?
  • プロジェクションが変更されるたびに Vid を発行する出版社。

    名前に関係なく、プロジェクションが変更されたにこれは実際に発行します。

    宣言

    Swift

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