投射
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
的更改通知。 您仍然可以访问原始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
要项目的对象。
-
托管对象的 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 }