프로젝션
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.lastNameCaps
및PersonProjection.homeCity
를 참조하세요.Collection mapping
-List
MutableSet
또는Object
의EmbeddedObject
및 는 기본 값의 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)
-
프로젝션되는 객체
선언
Swift
public let rootObject: Root
-
새 프로젝션을 만듭니다.
선언
Swift
public required init(projecting object: Root)
매개변수
object
프로젝트할 객체입니다.
-
객체를 managed하는 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에 대한 새로운 쓰기를 반영하도록 업데이트되지 않습니다. 동결된 collection은 다른 Realm collection과 마찬가지로 쿼리할 수 있습니다. 동결된 객체는 변경할 수 없으며 변경 알림을 위해 관찰할 수 없습니다. 관리되지 않는 Realm 객체는 동결할 수 없습니다.
경고
Realm에서 쓰기 트랜잭션(write transaction)을 수행하는 동안 동결된 객체를 오랫동안 유지하면 Realm 파일 크기가 커질 수 있습니다. 자세한 내용은Realm.Configuration.maximumNumberOfActiveVersions
를 참조하세요.선언
Swift
public func freeze() -> Self
-
이 객체의 라이브(변경 가능) 참고를 반환합니다. 이미 라이브 객체에 대해 호출되면 자체를 반환합니다.
선언
Swift
public func thaw() -> `Self`?
-
프로젝션이 변경될 때마다 Void를 방출하는 출판사입니다.
이름과 달리 실제로 프로젝션이 변경된 후에 방출합니다.
선언
Swift
public var objectWillChange: RealmPublishers.WillChange<Projection> { get }