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可以使用与RLMObjectRLMResult相同的谓词进行查询。

RLMDictionarys 不能直接创建。 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 }
  • 管理字典的 Realm。 对于非托管字典,返回nil

    声明

    Objective-C

    @property (nonatomic, readonly, nullable) RLMRealm *realm;

    Swift

    var realm: RLMRealm? { 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

    一个可枚举对象,例如NSDictionaryRLMDictionary ,其中包含与接收字典类型相同的对象。

查询字典

  • 返回字典中与给定谓词匹配的所有值。

    注意

    查询值时会忽略字典中的键,并且不会在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

    需要其最小值的属性。 仅支持类型为intfloatdoubleNSDateRLMValueRLMDecimal128的属性。

    返回值

    该属性的最小值,如果字典为空,则为nil

  • 返回字典中所有对象中给定属性的最大值。

    NSNumber *max = [object.dictionaryProperty maxOfProperty:@"age"];
    

    声明

    Objective-C

    - (nullable id)maxOfProperty:(nonnull NSString *)property;

    Swift

    func max(ofProperty property: String) -> Any?

    参数

    property

    需要其最小值的属性。 仅支持类型为intfloatdoubleNSDateRLMValueRLMDecimal128的属性。

    返回值

    该属性的最大值,如果字典为空,则为nil

  • 返回字典中所有对象的给定属性的不同值的总和。

    NSNumber *sum = [object.dictionaryProperty sumOfProperty:@"age"];
    

    声明

    Objective-C

    - (nonnull NSNumber *)sumOfProperty:(nonnull NSString *)property;

    Swift

    func sum(ofProperty property: String) -> NSNumber

    参数

    property

    需要其最小值的属性。 仅支持类型为intfloatdoubleRLMValueRLMDecimal128的属性。

    返回值

    给定属性的总和。

  • 返回字典中对象的给定属性的平均值。

    NSNumber *average = [object.dictionaryProperty averageOfProperty:@"age"];
    

    声明

    Objective-C

    - (nullable NSNumber *)averageOfProperty:(nonnull NSString *)property;

    Swift

    func average(ofProperty property: String) -> NSNumber?

    参数

    property

    需要其最小值的属性。 仅支持类型为intfloatdoubleNSDateRLMValueRLMDecimal128的属性。

    返回值

    给定属性的平均值,如果字典为空,则为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] 不可用,因为无法直接创建RLMDictionaryRLMDictionaryRLMObject上的 属性是在访问时延迟创建的。

    声明

    Objective-C

    - (nonnull instancetype)init;
  • 不可用

    无法直接创建 RLMDictionary

    +[RLMDictionary new] 不可用,因为无法直接创建RLMDictionaryRLMDictionaryRLMObject上的 属性是在访问时延迟创建的。

    声明

    Objective-C

    + (nonnull instancetype)new;