对象
extension Object
extension Object: @retroactive ObservableObject
extension Object: _RealmCollectionValueInsideOptional
extension Object: ThreadConfined
-
每次对象更改时发出 Void 的发布者。
尽管有这个名称,但它实际上是在对象发生更改后发出的。
声明
Swift
public var objectWillChange: RealmPublishers.WillChange<Object> { get }
-
创建 Realm 对象的非托管实例。
value
参数用于填充对象。 它可以是键值编码兼容对象、从NSJSONSerialization
中的方法返回的数组或字典,或者是包含每个托管属性一个元素的Array
。 如果任何必需属性不存在且未为这些属性定义默认值,则会引发异常。传入
Array
作为value
参数时,所有属性都必须存在、有效,并且顺序与模型中定义的属性相同。对
Realm
实例调用add(_:)
,以将非托管对象添加到该 Realm 中。声明
Swift
public convenience init(value: Any)
参数
value
用于填充对象的值。
-
托管对象的 Realm,如果对象为非托管对象,则为
nil
。声明
Swift
public var realm: Realm? { get }
-
列出对象的托管属性的对象模式。
声明
Swift
public var objectSchema: ObjectSchema { get }
-
指示对象是否因现已无效而无法再访问。
如果对象已从托管它的 Realm 中删除,或者对该 Realm 调用了
invalidate()
,则无法再访问该对象。该属性是键值可观察的。声明
Swift
dynamic open override var isInvalidated: Bool { get }
-
对象的人类可读描述。
声明
Swift
open override var description: String { get }
-
重写此方法以指定用作主键的属性名称。
只有类型为
String
、Int
、ObjectId
和UUID
的属性才能指定为主键。 每当设置属性时,主键属性都会为每个值强制唯一性,这会产生少量开销。 系统会自动为主键属性创建索引。声明
Swift
@objc open class func primaryKey() -> String?
返回值
指定为主键的属性名称;如果模型没有主键,则为
nil
。 -
重写此方法以指定要忽略的属性的名称。 这些属性不会由托管该对象的 Realm 进行托管。
声明
Swift
@objc open class func ignoredProperties() -> [String]
返回值
要忽略的属性名称数组。
-
返回应编制索引的属性的属性名称数组。
仅支持字符串、整数、布尔值、
Date
和NSDate
属性。声明
Swift
@objc open class func indexedProperties() -> [String]
返回值
属性名称数组。
-
重写此方法以指定公有-私有属性名称的映射。 这将在 Realm 上设置不同的持久属性名称,并允许对该属性的任何操作使用公共名称。 (例如:查询、排序……)。 如果您需要将属性名称从
Device Sync
JSON schema映射到本地属性名称,这非常有帮助。class Person: Object { @Persisted var firstName: String @Persisted var birthDate: Date @Persisted var age: Int override class public func propertiesMapping() -> [String : String] { ["firstName": "first_name", "birthDate": "birth_date"] } }
注意
只有具有不同列名的属性才必须添加到属性映射字典中。注意
在迁移区块中,当枚举具有公共/私有名称的旧属性时,您必须使用旧列名而不是公共列名来检索属性值。let migrationBlock = { migration, oldSchemaVersion in migration.enumerateObjects(ofType: "Person", { oldObj, newObj in let oldPropertyValue = oldObj!["first_name"] as! String // Use this value in migration }) }
重命名属性时也必须执行此操作。
let migrationBlock = { migration, oldSchemaVersion in migration.renameProperty(onType: "Person", from: "first_name", to: "complete_name") }
声明
Swift
open override class func propertiesMapping() -> [String : String]
返回值
公有-私有属性名称的字典。
-
返回或设置具有给定名称的属性的值。
声明
Swift
@objc open subscript(key: String) -> Any? { get set }
-
注册一个区块,以便在每次对象更改时调用。
在每次写事务(write transaction)删除对象或修改对象的任何托管属性(包括将属性设置为其现有值的自分配)后,将异步调用该块。
对于在不同线程或不同进程中执行的写事务(write transaction),当管理 Realm(自动)刷新到包含更改的版本时,将调用该区块,而对于本地写事务(write transaction),将在提交写事务(write transaction)后的未来某个时间点调用该区块。
如果未给出键路径,则在对对象的所有对象一级属性进行任何插入、修改或删除操作时都会执行该区块。
Object
通知默认为浅层通知,任何嵌套属性修改都不会触发通知,除非指定该属性的键路径。 如果提供了一个或多个关键路径,则将调用该区块以进行仅在所提供的关键路径上发生的更改。 例如,如果:class Dog: Object { @Persisted var name: String @Persisted var adopted: Bool @Persisted var siblings: List<Dog> } // ... where `dog` is a managed Dog object. dog.observe(keyPaths: ["adopted"], { changes in // ... })
- 上述通知块会在对
adopted
属性进行更改时触发,但不会在对name
进行任何更改时触发。 - 如果观察到的键路径为
["siblings"]
,则对siblings
列表的任何插入、删除或修改都将触发区块。 对someSibling.name
的更改不会trigger该区块(其中someSibling
是siblings
中包含的元素) 如果观察到的键路径为
["siblings.name"]
,则对siblings
列表的任何插入或删除都会trigger区块。 对于siblings
name
列表中包含的对象,只有对其属性进行修改才会trigger区块。
注意
同一对象上的多个通知令牌(针对单独的键路径进行过滤)不会进行排他性过滤。如果一项键路径变更符合一个通知令牌的条件,则该对象的所有通知令牌块都将执行。
如果未指定队列,则将通过标准事件循环传递通知,因此当事件循环被其他活动阻塞时无法传递通知。如果给出了队列,则将通知传递到该队列。 当无法立即传递通知时,可以将多个通知合并为一个通知。
与
List
和Results
不同,添加新的通知块后,不会执行“初始”回调。只有由 Realm 托管的对象才能以这种方式进行观察。只要您希望将更新发送到区块,就必须保留返回的令牌。 要停止接收更新,请对令牌调用
invalidate()
。在回调块中捕获对观察到的对象的强引用是安全的。 由于回调由返回的令牌而不是对象本身保留,因此不存在保留周期。
警告
在写事务(write transaction)期间或当包含的 Realm 为只读时,无法调用此方法。声明
Swift
public func observe<T: RLMObjectBase>(keyPaths: [String]? = nil, on queue: DispatchQueue? = nil, _ block: @escaping (ObjectChange<T>) -> Void) -> NotificationToken
参数
keyPaths
只有键路径数组中包含的属性在修改时才会触发区块。 如果为
nil
,则对象上的任何属性更改都会发送通知。 与有效属性不对应的字符串键路径将引发异常。 有关关联属性的更多详细信息,请参阅上述描述。queue
用于接收通知的串行调度队列。 如果为
nil
,则通知将传递到当前线程。block
要调用的区块,其中包含有关对象更改的信息。
返回值
只要您希望传递更新,就必须持有的令牌。
- 上述通知块会在对
-
注册一个区块,以便在每次对象更改时调用。
在每次写事务(write transaction)删除对象或修改对象的任何托管属性(包括将属性设置为其现有值的自分配)后,将异步调用该块。
对于在不同线程或不同进程中执行的写事务(write transaction),当管理 Realm(自动)刷新到包含更改的版本时,将调用该区块,而对于本地写事务(write transaction),将在提交写事务(write transaction)后的未来某个时间点调用该区块。
如果未给出键路径,则在对对象的所有对象一级属性进行任何插入、修改或删除操作时都会执行该区块。
Object
通知默认为浅层通知,任何嵌套属性修改都不会触发通知,除非指定该属性的键路径。 如果提供了一个或多个关键路径,则将调用该区块以进行仅在所提供的关键路径上发生的更改。 例如,我class Dog: Object { @Persisted var name: String @Persisted var adopted: Bool @Persisted var siblings: List<Dog> } // ... where `dog` is a managed Dog object. dog.observe(keyPaths: [\Dog.adopted], { changes in // ... })
- 上述通知块会在对
adopted
属性进行更改时触发,但不会在对name
进行任何更改时触发。 - 如果观察到的键路径为
[\Dog.siblings]
,则对siblings
列表的任何插入、删除或修改都将触发区块。 对someSibling.name
的更改不会trigger该区块(其中someSibling
是siblings
中包含的元素) 如果观察到的键路径为
[\Dog.siblings.name]
,则对siblings
列表的任何插入或删除都会trigger区块。 对于siblings
name
列表中包含的对象,只有对其属性进行修改才会trigger区块。
注意
同一对象上的多个通知令牌(针对单独的键路径进行过滤)不会进行排他性过滤。如果一项键路径变更符合一个通知令牌的条件,则该对象的所有通知令牌块都将执行。
如果未指定队列,则将通过标准事件循环传递通知,因此当事件循环被其他活动阻塞时无法传递通知。如果给出了队列,则将通知传递到该队列。 当无法立即传递通知时,可以将多个通知合并为一个通知。
与
List
和Results
不同,添加新的通知块后,不会执行“初始”回调。只有由 Realm 托管的对象才能以这种方式进行观察。只要您希望将更新发送到区块,就必须保留返回的令牌。 要停止接收更新,请对令牌调用
invalidate()
。在回调块中捕获对观察到的对象的强引用是安全的。 由于回调由返回的令牌而不是对象本身保留,因此不存在保留周期。
警告
在写事务(write transaction)期间或当包含的 Realm 为只读时,无法调用此方法。声明
Swift
public func observe<T: ObjectBase>(keyPaths: [PartialKeyPath<T>], on queue: DispatchQueue? = nil, _ block: @escaping (ObjectChange<T>) -> Void) -> NotificationToken
参数
keyPaths
只有键路径数组中包含的属性在修改时才会触发区块。 如果为
nil
,则对象上的任何属性更改都会发送通知。 有关关联属性的更多详细信息,请参阅上述描述。queue
用于接收通知的串行调度队列。 如果为
nil
,则通知将传递到当前线程。block
要调用的区块,其中包含有关对象更改的信息。
返回值
只要您希望传递更新,就必须持有的令牌。
- 上述通知块会在对
-
observe(keyPaths:
异步(Asynchronous)on: _isolation: _: ) 注册一个区块,以便在每次对象更改时调用。
每次写事务(write transaction)后,将在给定 actor 的执行程序上异步调用该区块,这会删除对象或修改对象的任何托管属性,包括将属性设置为其现有值的自分配。该区块会向该区块传递与所请求 actor 隔离的对象副本,该副本以及有关更改内容的信息可安全地用于该 actor。
对于在不同线程或不同进程中执行的写事务(write transaction),当管理 Realm(自动)刷新到包含更改的版本时,将调用该区块,而对于本地写事务(write transaction),将在提交写事务(write transaction)后的未来某个时间点调用该区块。
只有由 Realm 托管的对象才能以这种方式进行观察。只要您希望将更新发送到区块,就必须保留返回的令牌。 要停止接收更新,请对令牌调用
invalidate()
。默认情况下,只有对对象属性的直接更改才会生成通知,对链接对象的更改不会。 请注意,这与集合更改通知不同。 如果传入了非零、非空的键路径数组,则只有对这些键路径标识的属性进行更改才会生成更改通知。 键路径可以遍历链接属性以接收有关链接对象的变更的信息。
警告
在写事务(write transaction)期间或当包含的 Realm 为只读时,无法调用此方法。声明
Swift
@available(macOS 10.15, tvOS 13.0, iOS 13.0, watchOS 6.0, *) public func observe<A: Actor, T: Object>( keyPaths: [String]? = nil, on actor: A, _isolation: isolated (any Actor)? = #isolation, _ block: @Sendable @escaping (isolated A, ObjectChange<T>) -> Void ) async -> NotificationToken
参数
actor
要隔离通知的 actor。
block
要调用的区块,其中包含有关对象更改的信息。
返回值
只要您希望传递更新,就必须持有的令牌。
-
observe(keyPaths:
异步(Asynchronous)on: _isolation: _: ) 注册一个区块,以便在每次对象更改时调用。
每次写事务(write transaction)后,将在给定 actor 的执行程序上异步调用该区块,这会删除对象或修改对象的任何托管属性,包括将属性设置为其现有值的自分配。该区块会向该区块传递与所请求 actor 隔离的对象副本,该副本以及有关更改内容的信息可安全地用于该 actor。
对于在不同线程或不同进程中执行的写事务(write transaction),当管理 Realm(自动)刷新到包含更改的版本时,将调用该区块,而对于本地写事务(write transaction),将在提交写事务(write transaction)后的未来某个时间点调用该区块。
只有由 Realm 托管的对象才能以这种方式进行观察。只要您希望将更新发送到区块,就必须保留返回的令牌。 要停止接收更新,请对令牌调用
invalidate()
。默认情况下,只有对对象属性的直接更改才会生成通知,对链接对象的更改不会。 请注意,这与集合更改通知不同。 如果传入了非零、非空的键路径数组,则只有对这些键路径标识的属性进行更改才会生成更改通知。 键路径可以遍历链接属性以接收有关链接对象的变更的信息。
警告
在写事务(write transaction)期间或当包含的 Realm 为只读时,无法调用此方法。声明
Swift
@available(macOS 10.15, tvOS 13.0, iOS 13.0, watchOS 6.0, *) public func observe<A: Actor, T: Object>( keyPaths: [PartialKeyPath<T>], on actor: A, _isolation: isolated (any Actor)? = #isolation, _ block: @Sendable @escaping (isolated A, ObjectChange<T>) -> Void ) async -> NotificationToken
参数
actor
要隔离通知的 actor。
block
要调用的区块,其中包含有关对象更改的信息。
返回值
只要您希望传递更新,就必须持有的令牌。
-
返回两个 Realm 对象是否相同。
当且仅当对象由同一个 Realm 托管并指向数据库中的同一个底层对象时,对象才被视为相同。
注意
相等比较由
isEqual(_:)
实施。 如果 Realm 对象类型是使用主键定义的,则isEqual(_:)
的行为与此方法相同。如果未使用主键定义 Realm 对象类型,则isEqual(_:)
将使用比较对象身份的NSObject
行为。此方法可用于比较两个对象在数据库中的相等性,无论它们的Realm 对象类型是否定义了主键。声明
Swift
public func isSameObject(as object: Object?) -> Bool
参数
object
与接收器进行比较的对象。
-
指示此对象是否已冻结。
声明
Swift
public var isFrozen: Bool { get }
-
返回此对象的冻结(不可变)快照。
冻结副本是一个不可变对象,其中包含与该对象当前包含的数据相同的数据,但在写入包含的 Realm 时不会更新。 与活动对象不同,冻结对象可以从任何线程访问。
警告
在 Realm 上执行写事务(write transaction)时长时间持有冻结对象可能会导致 Realm 文件变大。有关更多信息,请参阅Realm.Configuration.maximumNumberOfActiveVersions
。警告
此方法只能在托管对象上调用。声明
Swift
public func freeze() -> Self
-
返回此对象的实时(可变)引用。
此方法为同一冻结对象的实时副本创建托管访问器。 如果在已经存在的对象上调用,则会返回 self。
声明
Swift
public func thaw() -> `Self`?