RLMDictionary
Objective-C
@interface RLMDictionary<RLMKeyType, RLMObjectType> : NSObject <RLMCollection>
Swift
@_nonSendable(_assumed) class RLMDictionary<RLMKeyType, RLMObjectType> : NSObject, RLMCollection where RLMKeyType : AnyObject, RLMObjectType : AnyObject
RLMDictionary
是Realm中的一种容器类型,表示键值对的动态集合。
与NSDictionary
不同, RLMDictionary
包含单个键和值类型。 在这些Docs中,这被称为字典的“type”和“keyType”。
声明RLMDictionary
属性时,必须使用与其应包含的对象相同的名称,将对象类型和 keyType 标记为符合协议。
RLM_COLLECTION_TYPE(ObjectType)
...
@property RLMDictionary<NSString *, ObjectType *><RLMString, ObjectType> *objectTypeDictionary;
RLMDictionary
可以使用与RLMObject
和RLMResult
相同的谓词进行查询。
RLMDictionary
s 不能直接创建。 RLMDictionary
上的RLMObject
属性是在访问时延迟创建的,或者可以通过查询 Realm 来获取。
RLMDictionary
仅支持NSString
作为键。 Realm 不允许在字典键中使用.
或$
字符。
键值观察
RLMDictionary
支持对RLMObject
子类的RLMDictionary
属性进行字典键值观察,并且当RLMDictionary
附加到托管RLMObject
时, RLMDictionary
实例本身的invalidated
属性符合键值观察( RLMDictionary
非托管RLMObject
上的 永远不会失效)。
-
字典中的条目数。
声明
Objective-C
@property (nonatomic, readonly) NSUInteger count;
Swift
var count: UInt { get }
-
字典中对象的类型。
声明
Objective-C
@property (nonatomic, readonly) RLMPropertyType type;
Swift
var type: RLMPropertyType { get }
-
此字典中使用的键的类型。
声明
Objective-C
@property (nonatomic, readonly) RLMPropertyType keyType;
Swift
var keyType: RLMPropertyType { get }
-
指示collection中的对象能否为
nil
。声明
Objective-C
@property (nonatomic, readonly, getter=isOptional) BOOL optional;
Swift
var isOptional: Bool { get }
-
字典中包含的对象的类名。
如果
type
不是 RLMPropertyTypeObject,则将为nil
。声明
Objective-C
@property (nonatomic, copy, readonly, nullable) NSString *objectClassName;
Swift
var objectClassName: String? { get }
-
指示是否无法再访问字典。
声明
Objective-C
@property (nonatomic, readonly, getter=isInvalidated) BOOL invalidated;
Swift
var isInvalidated: Bool { get }
-
指示字典是否已冻结。
冻结字典是不可变的,可以从任何线程访问。 冻结字典是通过在托管实时字典上调用
-freeze
来创建的。 非托管字典永远不会冻结。声明
Objective-C
@property (nonatomic, readonly, getter=isFrozen) BOOL frozen;
Swift
var isFrozen: Bool { get }
-
返回与给定键关联的值。
@discussion 如果密钥不以“@”开头,则调用对象(forKey:)。 如果键确实以“@”开头,则去掉“@”并使用键的其余部分调用 [super valueForKey:]。
声明
Objective-C
- (nullable id)valueForKey:(nonnull RLMKeyType)key;
Swift
func value(forKey key: RLMKeyType) -> Any?
参数
key
属性的名称。
返回值
与给定键或
nil
关联的值。 -
返回一个包含字典键的大量。
注意
数组中元素的顺序未定义。声明
Objective-C
@property (copy, readonly) NSArray<RLMKeyType> *_Nonnull allKeys;
Swift
var allKeys: [RLMKeyType] { get }
-
返回一个包含字典值的数组。
注意
数组中元素的顺序未定义。声明
Objective-C
@property (copy, readonly) NSArray<RLMObjectType> *_Nonnull allValues;
Swift
var allValues: [RLMObjectType] { get }
-
返回与给定键关联的值。
注意
nil
如果没有值与给定键关联,则返回。 如果该键与 null 关联,则返回 NSNull。声明
Objective-C
- (nullable RLMObjectType)objectForKey:(nonnull RLMKeyType)key;
Swift
func object(forKey key: RLMKeyType) -> RLMObjectType?
参数
key
要返回相应值的键。
返回值
与键关联的值。
-
返回与给定键关联的值。
注意
nil
如果没有值与给定键关联,则返回。 如果该键与 null 关联,则返回 NSNull。声明
Objective-C
- (nullable RLMObjectType)objectForKeyedSubscript:(nonnull RLMKeyType)key;
Swift
subscript(key: RLMKeyType) -> RLMObjectType? { get set }
参数
key
要返回相应值的键。
返回值
与键关联的值。
-
将给定的区块对象应用于字典的每个键值对。
注意
如果该区块将 *stop 设置为“是”,则枚举停止。
声明
Objective-C
- (void)enumerateKeysAndObjectsUsingBlock: (nonnull void (^)(RLMKeyType _Nonnull, RLMObjectType _Nonnull, BOOL *_Nonnull))block;
Swift
func enumerateKeysAndObjects(_ block: @escaping (RLMKeyType, RLMObjectType, UnsafeMutablePointer<ObjCBool>) -> Void)
参数
block
对字典中的条目进行操作的区块对象。
-
将一个字典的内容替换为另一个字典 - NSDictionary 或 RLMDictionary 的内容。
这将删除此字典中的所有元素,然后应用给定字典中的每个元素。
警告
此方法只能在写事务(write transaction)期间调用。警告
如果 otherDictionary 是 self,则字典为空。声明
Objective-C
- (void)setDictionary:(nonnull id)otherDictionary;
Swift
func setDictionary(_ otherDictionary: Any)
-
删除字典中的所有内容。
警告
此方法只能在写事务(write transaction)期间调用。声明
Objective-C
- (void)removeAllObjects;
Swift
func removeAllObjects()
-
从字典中删除由给定大量中的元素指定的条目。 如果给定的键不存在,则该键不会发生变更。
警告
此方法只能在写事务(write transaction)期间调用。声明
Objective-C
- (void)removeObjectsForKeys:(nonnull NSArray<RLMKeyType> *)keyArray;
Swift
func removeObjects(forKeys keyArray: [RLMKeyType])
-
从字典中删除给定键及其关联值。 如果键不存在,则不会修改字典。
警告
此方法只能在写事务(write transaction)期间调用。声明
Objective-C
- (void)removeObjectForKey:(nonnull RLMKeyType)key;
Swift
func removeObject(forKey key: RLMKeyType)
-
如果给定的键不存在,则将其添加到字典中;如果该键已存在,则更新给定键的值。
警告
此方法只能在写事务(write transaction)期间调用。声明
Objective-C
- (void)setObject:(nullable RLMObjectType)obj forKeyedSubscript:(nonnull RLMKeyType)key;
-
如果给定的键不存在,则将其添加到字典中;如果该键已存在,则更新给定键的值。
警告
此方法只能在写事务(write transaction)期间调用。声明
Objective-C
- (void)setObject:(nullable RLMObjectType)anObject forKey:(nonnull RLMKeyType)aKey;
Swift
func setObject(_ anObject: RLMObjectType?, forKey aKey: RLMKeyType)
-
将另一个字典中的条目添加到接收字典中。
注意
如果接收字典包含与 otherDictionary 相同的键,则接收字典将更新匹配键的每个键值对。
警告
此方法只能在写事务(write transaction)期间调用。
声明
Objective-C
- (void)addEntriesFromDictionary:(nonnull id<NSFastEnumeration>)otherDictionary;
Swift
func addEntries(fromDictionary otherDictionary: any NSFastEnumeration)
参数
otherDictionary
一个可枚举对象,例如
NSDictionary
或RLMDictionary
,其中包含与接收字典类型相同的对象。
-
返回字典中与给定谓词匹配的所有值。
注意
查询值时会忽略字典中的键,并且不会在
RLMResults
中返回键。声明
Objective-C
- (nonnull RLMResults<RLMObjectType> *)objectsWhere: (nonnull NSString *)predicateFormat, ...;
参数
predicateFormat
谓词格式字符串,可以选择后跟可变数量的参数。
返回值
与给定谓词匹配的对象的
RLMResults
。 -
返回字典中与给定谓词匹配的所有值。
注意
查询值时会忽略字典中的键,并且不会在
RLMResults
中返回键。声明
Objective-C
- (nonnull RLMResults<RLMObjectType> *)objectsWithPredicate: (nonnull NSPredicate *)predicate;
Swift
func objects(with predicate: NSPredicate) -> RLMResults
参数
predicate
用于筛选对象的谓词。
返回值
与给定谓词匹配的
RLMResults
对象 -
返回字典中所有值的排序后的 RLMResults。
注意
对值进行排序时,字典中的键将被忽略,并且不会在
RLMResults
中返回。声明
Objective-C
- (nonnull RLMResults<RLMObjectType> *) sortedResultsUsingKeyPath:(nonnull NSString *)keyPath ascending:(BOOL)ascending;
Swift
func sortedResults(usingKeyPath keyPath: String, ascending: Bool) -> RLMResults
参数
keyPath
排序依据的键路径。
ascending
排序的方向。
返回值
按指定键路径排序的
RLMResults
。 -
返回字典中所有值的排序后的 RLMResults。
注意
对值进行排序时,字典中的键将被忽略,并且不会在
RLMResults
中返回。声明
Objective-C
- (nonnull RLMResults<RLMObjectType> *)sortedResultsUsingDescriptors: (nonnull NSArray<RLMSortDescriptor *> *)properties;
Swift
func sortedResults(using properties: [RLMSortDescriptor]) -> RLMResults
参数
properties
要排序的
RLMSortDescriptor
数组。返回值
按指定属性排序的
RLMResults
。 -
从字典中的所有值中返回一个不同的
RLMResults
。注意
字典中的键将被忽略,也不会在
RLMResults
中返回。声明
Objective-C
- (nonnull RLMResults<RLMObjectType> *)distinctResultsUsingKeyPaths: (nonnull NSArray<NSString *> *)keyPaths;
Swift
func distinctResults(usingKeyPaths keyPaths: [String]) -> RLMResults
参数
keyPaths
去重的关键路径。
返回值
具有不同键路径值的
RLMResults
。
-
返回字典中所有值中给定属性的最小值。
NSNumber *min = [object.dictionaryProperty minOfProperty:@"age"];
声明
Objective-C
- (nullable id)minOfProperty:(nonnull NSString *)property;
Swift
func min(ofProperty property: String) -> Any?
参数
property
需要其最小值的属性。 仅支持类型为
int
、float
、double
、NSDate
、RLMValue
和RLMDecimal128
的属性。返回值
该属性的最小值,如果字典为空,则为
nil
。 -
返回字典中所有对象中给定属性的最大值。
NSNumber *max = [object.dictionaryProperty maxOfProperty:@"age"];
声明
Objective-C
- (nullable id)maxOfProperty:(nonnull NSString *)property;
Swift
func max(ofProperty property: String) -> Any?
参数
property
需要其最小值的属性。 仅支持类型为
int
、float
、double
、NSDate
、RLMValue
和RLMDecimal128
的属性。返回值
该属性的最大值,如果字典为空,则为
nil
。 -
返回字典中所有对象的给定属性的不同值的总和。
NSNumber *sum = [object.dictionaryProperty sumOfProperty:@"age"];
声明
Objective-C
- (nonnull NSNumber *)sumOfProperty:(nonnull NSString *)property;
Swift
func sum(ofProperty property: String) -> NSNumber
参数
property
需要其最小值的属性。 仅支持类型为
int
、float
、double
、RLMValue
和RLMDecimal128
的属性。返回值
给定属性的总和。
-
返回字典中对象的给定属性的平均值。
NSNumber *average = [object.dictionaryProperty averageOfProperty:@"age"];
声明
Objective-C
- (nullable NSNumber *)averageOfProperty:(nonnull NSString *)property;
Swift
func average(ofProperty property: String) -> NSNumber?
参数
property
需要其最小值的属性。 仅支持类型为
int
、float
、double
、NSDate
、RLMValue
和RLMDecimal128
的属性。返回值
给定属性的平均值,如果字典为空,则为
nil
。
-
注册一个区块,以便在每次字典更改时调用。
该区块将与初始字典一起异步调用,然后在每次更改字典中任何键或值的写事务(write transaction)后再次调用。
首次调用该区块时,
changes
参数将为nil
。 对于此后的每次调用,它将包含有关在字典中添加、修改或删除了哪些键的信息。 如果写事务(write transaction)未修改字典中的任何键或值,则根本不会调用该区块。存在错误参数只是为了向后兼容,并且将始终为
nil
。通知是通过标准事件循环传递的,因此当事件循环被其他活动阻止时无法传递。当无法立即传递通知时,可以将多个通知合并为一个通知。 这可以包括带有初始结果的通知。 例如,以下代码在添加通知块后立即执行写事务(write transaction),因此没有机会首先传递初始通知。因此,初始通知将反映写事务(write transaction)后 Realm 的状态。
Person *person = [[Person allObjectsInRealm:realm] firstObject]; NSLog(@"person.dogs.count: %zu", person.dogs.count); // => 0 self.token = [person.dogs addNotificationBlock(RLMDictionary<NSString *, Dog *><RLMString, Dog> *dogs, RLMDictionaryChange *changes, NSError *error) { // Only fired once for the example NSLog(@"dogs.count: %zu", dogs.count); // => 1 }]; [realm transactionWithBlock:^{ Dog *dog = [[Dog alloc] init]; dog.name = @"Rex"; person.dogs[@"frenchBulldog"] = dog; }]; // end of run loop execution context
只要您希望继续将更新发送到区块,就必须保留返回的令牌。 要停止接收更新,请对令牌调用
-invalidate
。警告
在写事务(write transaction)期间或当包含的 Realm 为只读时,无法调用此方法。警告
此方法只能在非冻结托管字典上调用。
声明
Objective-C
- (nonnull RLMNotificationToken *)addNotificationBlock: (nonnull void (^)(RLMDictionary<RLMKeyType, RLMObjectType> *_Nullable, RLMDictionaryChange *_Nullable, NSError *_Nullable))block;
Swift
func addNotificationBlock(_ block: @escaping (RLMDictionary<RLMKeyType, RLMObjectType>?, RLMDictionaryChange?, (any Error)?) -> Void) -> RLMNotificationToken
参数
block
每次字典更改时要调用的区块。
返回值
只要您希望传递更新,就必须持有的令牌。
-
注册一个区块,以便在每次字典更改时调用。
该区块将与初始字典一起异步调用,然后在每次写事务(write transaction)后再次调用,这会更改字典中的任何键值或结果中的对象。
首次调用该区块时,
changes
参数将为nil
。 对于此后的每次调用,它将包含有关在字典中添加或修改了哪些键的信息。 如果写事务(write transaction)未修改字典中的任何对象,则根本不会调用该区块。存在错误参数只是为了向后兼容,并且将始终为
nil
。通知将传递到给定队列。 如果队列阻塞且无法立即传递通知,则多个通知可能会合并为一个通知。
只要您希望继续将更新发送到区块,就必须保留返回的令牌。 要停止接收更新,请对令牌调用
-invalidate
。警告
当包含的 Realm 处于只读或冻结状态时,无法调用此方法。警告
该队列必须是串行队列。
声明
Objective-C
- (nonnull RLMNotificationToken *) addNotificationBlock: (nonnull void (^)(RLMDictionary<RLMKeyType, RLMObjectType> *_Nullable, RLMDictionaryChange *_Nullable, NSError *_Nullable))block queue:(nullable dispatch_queue_t)queue;
Swift
func addNotificationBlock(_ block: @escaping (RLMDictionary<RLMKeyType, RLMObjectType>?, RLMDictionaryChange?, (any Error)?) -> Void, queue: dispatch_queue_t?) -> RLMNotificationToken
参数
block
发生更改时要调用的区块。
queue
要向其传递通知的串行队列。
返回值
只要您希望传递更新,就必须持有的令牌。
-
注册一个区块,以便在每次字典更改时调用。
该区块将与初始字典一起异步调用,然后在每次写事务(write transaction)后再次调用,这会更改字典中的任何键值或结果中的对象。
首次调用该区块时,
changes
参数将为nil
。 对于此后的每次调用,它将包含有关在字典中添加或修改了哪些键的信息。 如果写事务(write transaction)未修改字典中的任何对象,则根本不会调用该区块。存在错误参数只是为了向后兼容,并且将始终为
nil
。通知将传递到给定队列。 如果队列阻塞且无法立即传递通知,则多个通知可能会合并为一个通知。
只要您希望继续将更新发送到区块,就必须保留返回的令牌。 要停止接收更新,请对令牌调用
-invalidate
。警告
当包含的 Realm 处于只读或冻结状态时,无法调用此方法。警告
该队列必须是串行队列。
声明
Objective-C
- (nonnull RLMNotificationToken *) addNotificationBlock: (nonnull void (^)(RLMDictionary<RLMKeyType, RLMObjectType> *_Nullable, RLMDictionaryChange *_Nullable, NSError *_Nullable))block keyPaths:(nullable NSArray<NSString *> *)keyPaths queue:(nullable dispatch_queue_t)queue;
Swift
func addNotificationBlock(_ block: @escaping (RLMDictionary<RLMKeyType, RLMObjectType>?, RLMDictionaryChange?, (any Error)?) -> Void, keyPaths: [String]?, queue: dispatch_queue_t?) -> RLMNotificationToken
参数
block
发生更改时要调用的区块。
keyPaths
这些键路径上发生的更改将调用该区块。 如果未给出键路径,则为每个属性键路径传递通知。
返回值
只要您希望传递更新,就必须持有的令牌。
-
注册一个区块,以便在每次字典更改时调用。
该区块将与初始字典一起异步调用,然后在每次写事务(write transaction)后再次调用,这会更改字典中的任何键值或结果中的对象。
首次调用该区块时,
changes
参数将为nil
。 对于此后的每次调用,它将包含有关在字典中添加或修改了哪些键的信息。 如果写事务(write transaction)未修改字典中的任何对象,则根本不会调用该区块。存在错误参数只是为了向后兼容,并且将始终为
nil
。只要您希望继续将更新发送到区块,就必须保留返回的令牌。 要停止接收更新,请对令牌调用
-invalidate
。警告
当包含的 Realm 处于只读或冻结状态时,无法调用此方法。警告
该队列必须是串行队列。
声明
Objective-C
- (nonnull RLMNotificationToken *) addNotificationBlock: (nonnull void (^)(RLMDictionary<RLMKeyType, RLMObjectType> *_Nullable, RLMDictionaryChange *_Nullable, NSError *_Nullable))block keyPaths:(nullable NSArray<NSString *> *)keyPaths;
Swift
func addNotificationBlock(_ block: @escaping (RLMDictionary<RLMKeyType, RLMObjectType>?, RLMDictionaryChange?, (any Error)?) -> Void, keyPaths: [String]?) -> RLMNotificationToken
参数
block
发生更改时要调用的区块。
keyPaths
这些键路径上发生的更改将调用该区块。 如果未给出键路径,则为每个属性键路径传递通知。
返回值
只要您希望传递更新,就必须持有的令牌。
-
返回字典的冻结(不可变)快照。
冻结副本是一个不可变的字典,其中包含与此字典当前包含的数据相同的数据,但在写入包含的Realm时不会更新。 与活动字典不同,冻结字典可以从任何线程访问。
警告
在写事务(write transaction)期间或当包含的 Realm 为只读时,无法调用此方法。警告
此方法只能在托管字典上调用。警告
在Realm上执行写事务(write transaction)时长时间持有冻结的字典可能会导致Realm 文件变大。 有关更多信息,请参阅RLMRealmConfiguration.maximumNumberOfActiveVersions
。声明
Objective-C
- (nonnull instancetype)freeze;
Swift
func freeze() -> Self
-
返回此冻结collection的实时版本。
此方法解析对同一冻结collection的实时副本的引用。如果在实时collection上调用,则返回自身。
声明
Objective-C
- (nonnull instancetype)thaw;
Swift
func thaw() -> Self
-
不可用
无法直接创建 RLMDictionary
-[RLMDictionary init]
不可用,因为无法直接创建RLMDictionary
。RLMDictionary
RLMObject
上的 属性是在访问时延迟创建的。声明
Objective-C
- (nonnull instancetype)init;
-
不可用
无法直接创建 RLMDictionary
+[RLMDictionary new]
不可用,因为无法直接创建RLMDictionary
。RLMDictionary
RLMObject
上的 属性是在访问时延迟创建的。声明
Objective-C
+ (nonnull instancetype)new;