프로젝션

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>
}

### 지원되는 속성 유형

프로젝션은 여러 가지 방법으로 원래 @Persisted 속성을 변환할 수 있습니다.

  • Passthrough - Projection의 속성은 원본 객체와 동일한 이름 및 유형을 갖습니다. PersonProjection.firstName 을(를) 참조하세요.
  • Rename - 프로젝션의 속성은 새 이름만 포함된 원본 객체와 동일한 유형을 갖습니다.
  • Keypath resolution - 프로젝션된 Object 의 특정 속성에 액세스할 수 있습니다. PersonProjection.lastNameCapsPersonProjection.homeCity 를 참조하세요.
  • Collection mapping - List MutableSet또는 ObjectEmbeddedObject및 는 기본 값의 collection으로 프로젝션될 수 있습니다. PersonProjection.friendsFirstName 를 참조하세요.
  • Exclusion - 프로젝션 모델에 정의되지 않은 원본 Realm 객체의 모든 속성은 프로젝션에서 제외됩니다. 해당 속성에 발생한 변경 사항은 Projection 에 대한 변경 알림을 trigger하지 않습니다. 여전히 원본 Object 또는 EmbeddedObject 에 액세스하고 직접 알림을 관찰할 수 있습니다.

참고

즉, 각 @Persisted 속성은 동일한 프로젝션 클래스에서 서로 다른 방식으로 @Projected 수 있습니다. 각 Object 또는 EmbeddedObject 는 동일하거나 다른 클래스의 여러 프로젝션을 한 번에 가질 수 있습니다.

쿼리하기

Realm의 objects(_:) 또는 프로젝션 클래스의 init(projecting:) 를 호출하여 Realm에서 특정 유형의 모든 프로젝션을 조회할 수 있습니다.

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

Root: ThreadConfined에서 사용 가능

  • 객체를 managed하는 Realm이거나 객체가 관리되지 않는 경우 nil 입니다. 참고: 프로젝션은 관리 객체에 대해서만 인스턴스화할 수 있으므로 realm은 nil이 되지 않습니다. 관리되지 않는 객체는 스레드에 국한되지 않으며 ThreadConfined 객체를 예상하는 메서드에 전달될 수 없습니다.

    선언

    스위프트

    public var realm: Realm? { get }
  • 객체가 유효하지 않아 더 이상 액세스할 수 없는지 여부를 나타냅니다.

    선언

    스위프트

    public var isInvalidated: Bool { get }
  • 객체가 동결되었는지 여부를 나타냅니다. 동결된 객체는 소스 스레드에 국한되지 않습니다. 동결된 객체에 ThreadSafeReference 를 형성하는 것은 허용되지만 유용할 가능성은 낮습니다.

    선언

    스위프트

    public var isFrozen: Bool { get }
  • 이 객체의 동결된 스냅샷을 반환합니다. 일반 Realm 라이브 객체와 달리 동결된 사본은 모든 스레드에서 읽을 수 있으며 읽은 값은 Realm에 대한 새로운 쓰기를 반영하도록 업데이트되지 않습니다. 동결된 collection은 다른 Realm collection과 마찬가지로 쿼리할 수 있습니다. 동결된 객체는 변경할 수 없으며 변경 알림을 위해 관찰할 수 없습니다. 관리되지 않는 Realm 객체는 동결할 수 없습니다.

    경고

    Realm에서 쓰기 트랜잭션(write transaction)을 수행하는 동안 동결된 객체를 오랫동안 유지하면 Realm 파일 크기가 커질 수 있습니다. 자세한 내용은 Realm.Configuration.maximumNumberOfActiveVersions 를 참조하세요.

    선언

    스위프트

    public func freeze() -> Self
  • 이 객체의 라이브(변경 가능) 참고를 반환합니다. 이미 라이브 객체에 대해 호출되면 자체를 반환합니다.

    선언

    스위프트

    public func thaw() -> `Self`?
  • 프로젝션이 변경될 때마다 Void를 방출하는 출판사입니다.

    이름과 달리 실제로 프로젝션이 변경된 후에 방출합니다.

    선언

    스위프트

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