RLMEmbeddedObject
Objective-C
@interface RLMEmbeddedObject : RLMObjectBase <RLMThreadConfined>
Swift
@_nonSendable(_assumed) class RLMEmbeddedObject : RLMObjectBase, RLMThreadConfined
RLMEmbeddedObject
是用于定义 Realm 模型对象的基类。
嵌入式对象的工作方式与普通对象类似,但由单个父对象(其本身可能是嵌入式对象)拥有。 与普通的顶级对象不同,嵌入式对象不能直接在 Realm 中创建或添加到 Realm 中。 相反,它们只能作为父对象的一部分创建,或者通过将非托管对象分配给父对象的属性来创建。 通过重新分配 RLMObject 属性或从包含嵌入式对象的数组中删除嵌入式对象,删除对象或将对象修改为不再指向嵌入式对象时,嵌入式对象会自动删除。
嵌入式对象只能有一个链接到它们的父对象,尝试链接到现有的托管嵌入式对象会引发异常。
RLMEmbeddedObject
支持的属性类型与RLMObject
相同,不同之处在于嵌入式对象无法链接到顶级对象,因此不支持RLMObject
和RLMArray<RLMObject>
属性( RLMEmbeddedObject
和RLMArray<RLMEmbeddedObject>
是)。
嵌入式对象不能具有主键或索引属性。
-
创建 Realm 对象的非托管实例。
可以通过将非托管嵌入式对象分配给托管 Realm 对象的对象属性或将其添加到托管 RLMArray 来将其添加到 Realm 中。
声明
Objective-C
- (nonnull instancetype)init;
Swift
init()
-
创建 Realm 对象的非托管实例。
传入
NSArray
或NSDictionary
实例以设置对象属性的值。可以通过将非托管嵌入式对象分配给托管 Realm 对象的对象属性或将其添加到托管 RLMArray 来将其添加到 Realm 中。
声明
Objective-C
- (nonnull instancetype)initWithValue:(nonnull id)value;
Swift
convenience init(value: Any)
-
返回 Realm 对象子类的类名。
警告
请勿覆盖。 Realm 依赖此方法返回准确的类名。
声明
Objective-C
+ (nonnull NSString *)className;
Swift
class func className() -> String
返回值
模型类的类名。
-
列出对象的托管属性的对象模式。
声明
Objective-C
@property (nonatomic, readonly) RLMObjectSchema *_Nonnull objectSchema;
Swift
var objectSchema: RLMObjectSchema { get }
-
指示对象是否因现已无效而无法再访问。
如果对象已从托管它的 Realm 中删除,或者对该 Realm 调用了
invalidate
,则无法再访问该对象。声明
Objective-C
@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated;
Swift
var isInvalidated: Bool { get }
-
指示此对象是否已冻结。
声明
Objective-C
@property (nonatomic, readonly, getter=isFrozen) BOOL frozen;
Swift
var isFrozen: Bool { get }
-
重写此方法以指定用于每个属性的默认值。
声明
Objective-C
+ (nullable NSDictionary *)defaultPropertyValues;
Swift
class func defaultPropertyValues() -> [AnyHashable : Any]?
返回值
将属性名称映射到其默认值的字典。
-
重写此方法以指定要忽略的属性的名称。 这些属性不会由托管该对象的 Realm 进行托管。
声明
Objective-C
+ (nullable NSArray<NSString *> *)ignoredProperties;
Swift
class func ignoredProperties() -> [String]?
返回值
要忽略的属性名称数组。
-
重写此方法以指定非可选属性的名称(即 不能分配
nil
值)。默认情况下,其值可设置为
nil
的类型的所有属性均被视为可选属性。 要要求 Realm 中的对象始终为属性存储非nil
值,请将该属性的名称添加到从此方法返回的数组中。RLMEmbeddedObject
类型的属性不能是非可选的。 数组和NSNumber
属性可以是非可选的,但没有理由这样做:数组不支持存储 nil,如果需要非可选数字,则应使用基元类型。声明
Objective-C
+ (nonnull NSArray<NSString *> *)requiredProperties;
Swift
class func requiredProperties() -> [String]
返回值
所需属性名称的数组。
-
重写此方法以提供与包含链接对象的属性相关的信息。
在此方法返回的字典中,每个
RLMLinkingObjects
类型的属性都必须有一个由属性名称组成的键。 相应的值必须是RLMPropertyDescriptor
的实例,用于描述属性链接到的类和属性。return @{ @"owners": [RLMPropertyDescriptor descriptorWithClass:Owner.class propertyName:@"dogs"] };
声明
Objective-C
+ (nonnull NSDictionary<NSString *, RLMPropertyDescriptor *> *) linkingObjectsProperties;
Swift
class func linkingObjectsProperties() -> [String : RLMPropertyDescriptor]
返回值
将属性名称映射到
RLMPropertyDescriptor
实例的字典。
-
注册一个区块,以便在每次对象更改时调用。
在每次写事务(write transaction)删除对象或修改对象的任何托管属性(包括将属性设置为其现有值的自分配)后,将异步调用该块。
对于在不同线程或不同进程中执行的写事务(write transaction),当管理 Realm(自动)刷新到包含更改的版本时,将调用该区块,而对于本地写事务(write transaction),将在某个点在写事务(write transaction)已提交后的未来某个时间调用。
通知是通过标准事件循环传递的,因此当事件循环被其他活动阻止时无法传递。当无法立即传递通知时,可以将多个通知合并为一个通知。
与
RLMArray
和RLMResults
不同,添加新的通知块后,不会执行“初始”回调。只有由 Realm 托管的对象才能以这种方式进行观察。只要您希望将更新发送到区块,就必须保留返回的令牌。 要停止接收更新,请对令牌调用
-invalidate
。在回调块中捕获对观察到的对象的强引用是安全的。 由于回调由返回的令牌而不是对象本身保留,因此不存在保留周期。
警告
在写事务(write transaction)期间、当包含的 Realm 为只读时或在非托管对象上时,无法调用此方法。
声明
Objective-C
- (nonnull RLMNotificationToken *)addNotificationBlock: (nonnull RLMObjectChangeBlock)block;
Swift
func addNotificationBlock(_ block: @escaping RLMObjectChangeBlock) -> RLMNotificationToken
参数
block
发生更改时要调用的区块。
返回值
只要您希望传递更新,就必须持有的令牌。
-
注册一个区块,以便在每次对象更改时调用。
在每次写事务(write transaction)删除对象或修改对象的任何托管属性(包括将属性设置为其现有值的自分配)后,将异步调用该块。
对于在不同线程或不同进程中执行的写事务(write transaction),当管理 Realm(自动)刷新到包含更改的版本时,将调用该区块,而对于本地写事务(write transaction),将在提交写事务(write transaction)后的未来某个时间点调用该区块。
通知将传递到给定队列。 如果队列阻塞且无法立即传递通知,则多个通知可能会合并为一个通知。
与
RLMArray
和RLMResults
不同,添加新的通知块后,不会执行“初始”回调。只有由 Realm 托管的对象才能以这种方式进行观察。只要您希望将更新发送到区块,就必须保留返回的令牌。 要停止接收更新,请对令牌调用
-invalidate
。在回调块中捕获对观察到的对象的强引用是安全的。 由于回调由返回的令牌而不是对象本身保留,因此不存在保留周期。
警告
在写事务(write transaction)期间、当包含的 Realm 为只读时或在非托管对象上时,无法调用此方法。警告
该队列必须是串行队列。
声明
Objective-C
- (nonnull RLMNotificationToken *) addNotificationBlock:(nonnull RLMObjectChangeBlock)block queue:(nonnull dispatch_queue_t)queue;
Swift
func addNotificationBlock(_ block: @escaping RLMObjectChangeBlock, queue: dispatch_queue_t) -> RLMNotificationToken
参数
block
发生更改时要调用的区块。
queue
要向其传递通知的串行队列。
返回值
只要您希望传递更新,就必须持有的令牌。
-
注册一个区块,以便在每次对象更改时调用。
在每次写事务(write transaction)删除对象或修改对象的任何托管属性(包括将属性设置为其现有值的自分配)后,将异步调用该块。
对于在不同线程或不同进程中执行的写事务(write transaction),当管理 Realm(自动)刷新到包含更改的版本时,将调用该区块,而对于本地写事务(write transaction),将在提交写事务(write transaction)后的未来某个时间点调用该区块。
通知将传递到给定队列。 如果队列阻塞且无法立即传递通知,则多个通知可能会合并为一个通知。
与
RLMArray
和RLMResults
不同,添加新的通知块后,不会执行“初始”回调。只有由 Realm 托管的对象才能以这种方式进行观察。只要您希望将更新发送到区块,就必须保留返回的令牌。 要停止接收更新,请对令牌调用
-invalidate
。在回调块中捕获对观察到的对象的强引用是安全的。 由于回调由返回的令牌而不是对象本身保留,因此不存在保留周期。
警告
在写事务(write transaction)期间、当包含的 Realm 为只读时或在非托管对象上时,无法调用此方法。警告
该队列必须是串行队列。
声明
Objective-C
- (nonnull RLMNotificationToken *) addNotificationBlock:(nonnull RLMObjectChangeBlock)block keyPaths:(nonnull NSArray<NSString *> *)keyPaths queue:(nonnull dispatch_queue_t)queue;
Swift
func addNotificationBlock(_ block: @escaping RLMObjectChangeBlock, keyPaths: [String], queue: dispatch_queue_t) -> RLMNotificationToken
参数
block
发生更改时要调用的区块。
keyPaths
这些键路径上发生的更改将调用该区块。 如果未给出键路径,则为每个属性键路径传递通知。
queue
要向其传递通知的串行队列。
返回值
只要您希望传递更新,就必须持有的令牌。
-
注册一个区块,以便在每次对象更改时调用。
在每次写事务(write transaction)删除对象或修改对象的任何托管属性(包括将属性设置为其现有值的自分配)后,将异步调用该块。
对于在不同线程或不同进程中执行的写事务(write transaction),当管理 Realm(自动)刷新到包含更改的版本时,将调用该区块,而对于本地写事务(write transaction),将在提交写事务(write transaction)后的未来某个时间点调用该区块。
通知将传递到给定队列。 如果队列阻塞且无法立即传递通知,则多个通知可能会合并为一个通知。
与
RLMArray
和RLMResults
不同,添加新的通知块后,不会执行“初始”回调。只有由 Realm 托管的对象才能以这种方式进行观察。只要您希望将更新发送到区块,就必须保留返回的令牌。 要停止接收更新,请对令牌调用
-invalidate
。在回调块中捕获对观察到的对象的强引用是安全的。 由于回调由返回的令牌而不是对象本身保留,因此不存在保留周期。
警告
在写事务(write transaction)期间、当包含的 Realm 为只读时或在非托管对象上时,无法调用此方法。警告
该队列必须是串行队列。
声明
Objective-C
- (nonnull RLMNotificationToken *) addNotificationBlock:(nonnull RLMObjectChangeBlock)block keyPaths:(nonnull NSArray<NSString *> *)keyPaths;
Swift
func addNotificationBlock(_ block: @escaping RLMObjectChangeBlock, keyPaths: [String]) -> RLMNotificationToken
参数
block
发生更改时要调用的区块。
keyPaths
这些键路径上发生的更改将调用该区块。 如果未给出键路径,则为每个属性键路径传递通知。
返回值
只要您希望传递更新,就必须持有的令牌。
-
如果另一个 Realm 对象实例指向与管理接收器的 Realm 中的接收器相同的对象,则返回 YES。
对于冻结对象和带有主键的Realm 对象类型,会重写
isEqual:
以使用与此方法相同的逻辑(以及hash
的相应实现)。没有主键的非冻结对象对isEqual:
和hash
使用指针标识。声明
Objective-C
- (BOOL)isEqualToObject:(nonnull RLMEmbeddedObject *)object;
Swift
func isEqual(to object: RLMEmbeddedObject) -> Bool
参数
object
与接收器进行比较的对象。
返回值
该对象是否与接收者表示同一对象。
-
返回此对象的冻结(不可变)快照。
冻结副本是一个不可变对象,其中包含与该对象当前包含的数据相同的数据,但在写入包含的 Realm 时不会更新。 与活动对象不同,冻结对象可以从任何线程访问。
警告
在 Realm 上执行写事务(write transaction)时长时间持有冻结对象可能会导致 Realm 文件变大。有关更多信息,请参阅Realm.Configuration.maximumNumberOfActiveVersions
。警告
此方法只能在托管对象上调用。声明
Objective-C
- (nonnull instancetype)freeze;
Swift
func freeze() -> Self
-
返回此对象的实时(可变)引用。
此方法为同一冻结对象的实时副本创建托管访问器。 如果在已经存在的对象上调用,则会返回 self。
声明
Objective-C
- (nonnull instancetype)thaw;
Swift
func thaw() -> Self