プロジェクション
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.lastNameCaps
とPersonProjection.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
プロジェクトするオブジェクト。
-
オブジェクトを管理する 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 }