RLMArray

Objective-C

@interface RLMArray<RLMObjectType> : NSObject <RLMCollection>

Swift

@_nonSendable(_assumed) class RLMArray<RLMObjectType> : NSObject, RLMCollection where RLMObjectType : AnyObject

RLMArray 是 Realm 中用于定义多个 container 关系的类型。

NSArray不同, RLMArray包含由objectClassName属性指定的单一类型。 在这些Docs中,这称为数组的“类型”。

声明RLMArray属性时,必须使用与其应包含的对象相同的名称将该类型标记为符合协议(请参阅RLM_COLLECTION_TYPE宏)。 此外,可以使用 Objective-C 泛型声明该属性,以提高编译时类型安全性。

RLM_COLLECTION_TYPE(ObjectType)
...
@property RLMArray<ObjectType *><ObjectType> *arrayOfObjectTypes;

RLMArray可以使用与RLMObjectRLMResult相同的谓词进行查询。

RLMArrays 不能直接创建。 RLMArray上的RLMObject 属性是在访问时延迟创建的,或者可以通过查询 Realm 来获取。

键值观察

RLMArray 支持对RLMObject子类上的RLMArray属性进行数组键值观察,并且当RLMArray附加到托管RLMObject时, RLMArray实例本身的invalidated属性符合键值观察( RLMArray非托管RLMObject上的 永远不会失效)。

由于RLMArray附加到它们所属的对象,因此它们不需要使用来自-mutableArrayValueForKey:的可变collection代理对象或在包含的对象上使用与 KVC 兼容的变更方法。 相反,您可以直接在RLMArray上调用变更方法。

属性

  • 数组中对象的数量。

    声明

    Objective-C

    @property (nonatomic, readonly) NSUInteger count;

    Swift

    var count: UInt { get }
  • 数组中对象的类型。

    声明

    Objective-C

    @property (nonatomic, readonly) RLMPropertyType type;

    Swift

    var type: 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 }

访问数组中的对象

  • 返回指定索引处的对象。

    声明

    Objective-C

    - (nonnull RLMObjectType)objectAtIndex:(NSUInteger)index;

    Swift

    func object(at index: UInt) -> RLMObjectType

    参数

    index

    要查找的索引。

    返回值

    数组中包含的类型的对象。

  • 返回一个数组,其中包含数组中给定索引集指定的索引处的对象。 如果索引集包含超出数组范围的索引,则返回nil

    声明

    Objective-C

    - (nullable NSArray<RLMObjectType> *)objectsAtIndexes:
        (nonnull NSIndexSet *)indexes;

    Swift

    func objects(at indexes: IndexSet) -> [RLMObjectType]?

    参数

    indexes

    数组中要从中检索对象的索引。

    返回值

    指定索引处的对象。

  • 返回数组中的第一个对象。

    如果对空数组调用,则返回nil

    声明

    Objective-C

    - (nullable RLMObjectType)firstObject;

    Swift

    func firstObject() -> RLMObjectType?

    返回值

    数组中包含的类型的对象。

  • 返回数组中的最后一个对象。

    如果对空数组调用,则返回nil

    声明

    Objective-C

    - (nullable RLMObjectType)lastObject;

    Swift

    func lastObject() -> RLMObjectType?

    返回值

    数组中包含的类型的对象。

添加、删除和替换数组中的对象

  • 将对象添加到数组的末尾。

    警告

    此方法只能在写事务(write transaction)期间调用。

    声明

    Objective-C

    - (void)addObject:(nonnull RLMObjectType)object;

    Swift

    func add(_ object: RLMObjectType)

    参数

    object

    数组中包含的类型的对象。

  • 将一个对象数组添加到该数组的末尾。

    警告

    此方法只能在写事务(write transaction)期间调用。

    声明

    Objective-C

    - (void)addObjects:(nonnull id<NSFastEnumeration>)objects;

    Swift

    func addObjects(_ objects: any NSFastEnumeration)

    参数

    objects

    一个可枚举对象,例如NSArrayRLMResults ,其中包含与数组同一类的对象。

  • 在给定索引处插入一个对象。

    如果索引超出数组边界,则会引发异常。

    警告

    此方法只能在写事务(write transaction)期间调用。

    声明

    Objective-C

    - (void)insertObject:(nonnull RLMObjectType)anObject atIndex:(NSUInteger)index;

    Swift

    func insert(_ anObject: RLMObjectType, at index: UInt)

    参数

    anObject

    数组中包含的类型的对象。

    index

    要插入对象的索引。

  • 删除给定索引处的对象。

    如果索引超出数组边界,则会引发异常。

    警告

    此方法只能在写事务(write transaction)期间调用。

    声明

    Objective-C

    - (void)removeObjectAtIndex:(NSUInteger)index;

    Swift

    func removeObject(at index: UInt)

    参数

    index

    标识要删除的对象的数组索引。

  • 删除数组中的最后一个对象。

    如果数组已经为空,则不执行此操作。

    警告

    此方法只能在写事务(write transaction)期间调用。

    声明

    Objective-C

    - (void)removeLastObject;

    Swift

    func removeLastObject()
  • 从数组中删除所有对象。

    警告

    此方法只能在写事务(write transaction)期间调用。

    声明

    Objective-C

    - (void)removeAllObjects;

    Swift

    func removeAllObjects()
  • 用新对象替换给定索引处的对象。

    如果索引超出数组边界,则会引发异常。

    警告

    此方法只能在写事务(write transaction)期间调用。

    声明

    Objective-C

    - (void)replaceObjectAtIndex:(NSUInteger)index
                      withObject:(nonnull RLMObjectType)anObject;

    Swift

    func replaceObject(at index: UInt, with anObject: RLMObjectType)

    参数

    index

    要替换的对象的索引。

    anObject

    一个对象(与从objectClassName选择器返回的类型相同)。

  • 将给定源索引处的对象移动到给定目标索引处。

    如果索引超出数组边界,则会引发异常。

    警告

    此方法只能在写事务(write transaction)期间调用。

    声明

    Objective-C

    - (void)moveObjectAtIndex:(NSUInteger)sourceIndex
                      toIndex:(NSUInteger)destinationIndex;

    Swift

    func moveObject(at sourceIndex: UInt, to destinationIndex: UInt)

    参数

    sourceIndex

    要移动的对象的索引。

    destinationIndex

    sourceIndex处的对象应移动到的目标索引。

  • 交换数组中给定索引处的对象。

    如果任一索引超出数组边界,则会引发异常。

    警告

    此方法只能在写事务(write transaction)期间调用。

    声明

    Objective-C

    - (void)exchangeObjectAtIndex:(NSUInteger)index1
                withObjectAtIndex:(NSUInteger)index2;

    Swift

    func exchangeObject(at index1: UInt, withObjectAt index2: UInt)

    参数

    index1

    应替换索引index2处对象的对象索引。

    index2

    应替换索引index1处对象的对象索引。

查询数组

  • 返回对象在数组中的索引。

    如果在数组中未找到该对象,则返回NSNotFound

    声明

    Objective-C

    - (NSUInteger)indexOfObject:(nonnull RLMObjectType)object;

    Swift

    func index(of object: RLMObjectType) -> UInt

    参数

    object

    一个对象(与从objectClassName选择器返回的类型相同)。

  • 返回数组中与谓词匹配的第一个对象的索引。

    声明

    Objective-C

    - (NSUInteger)indexOfObjectWhere:(nonnull NSString *)predicateFormat, ...;

    参数

    predicateFormat

    谓词格式字符串,可以选择后跟可变数量的参数。

    返回值

    对象的索引;如果在数组中未找到该对象,则为NSNotFound

  • 返回数组中与谓词匹配的第一个对象的索引。

    声明

    Objective-C

    - (NSUInteger)indexOfObjectWithPredicate:(nonnull NSPredicate *)predicate;

    Swift

    func indexOfObject(with predicate: NSPredicate) -> UInt

    参数

    predicate

    用于筛选对象的谓词。

    返回值

    对象的索引;如果在数组中未找到该对象,则为NSNotFound

  • 返回数组中与给定谓词匹配的所有对象。

    声明

    Objective-C

    - (nonnull RLMResults<RLMObjectType> *)objectsWhere:
        (nonnull NSString *)predicateFormat, ...;

    参数

    predicateFormat

    谓词格式字符串,可以选择后跟可变数量的参数。

    返回值

    与给定谓词匹配的对象的RLMResults

  • 返回数组中与给定谓词匹配的所有对象。

    声明

    Objective-C

    - (nonnull RLMResults<RLMObjectType> *)objectsWithPredicate:
        (nonnull NSPredicate *)predicate;

    Swift

    func objects(with predicate: NSPredicate) -> RLMResults

    参数

    predicate

    用于筛选对象的谓词。

    返回值

    与给定谓词匹配的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

    声明

    Objective-C

    - (nonnull RLMResults<RLMObjectType> *)sortedResultsUsingDescriptors:
        (nonnull NSArray<RLMSortDescriptor *> *)properties;

    Swift

    func sortedResults(using properties: [RLMSortDescriptor]) -> RLMResults

    参数

    properties

    要排序的RLMSortDescriptor数组。

    返回值

    按指定属性排序的RLMResults

  • 从数组中返回不同的RLMResults

    声明

    Objective-C

    - (nonnull RLMResults<RLMObjectType> *)distinctResultsUsingKeyPaths:
        (nonnull NSArray<NSString *> *)keyPaths;

    Swift

    func distinctResults(usingKeyPaths keyPaths: [String]) -> RLMResults

    参数

    keyPaths

    去重的关键路径。

    返回值

    具有不同键路径值的RLMResults

对数组进行分区

通知

  • 注册一个区块,以便在每次数组更改时调用。

    该区块将与初始数组一起异步调用,然后在每次写事务(write transaction)后再次调用,这会更改数组中的任何对象、结果中的对象或数组中对象的顺序。

    首次调用该区块时, changes参数将为nil 。 对于此后的每次调用,它将包含有关在数组中添加、删除或修改了哪些行的信息。 如果写事务(write transaction)未修改数组中的任何对象,则根本不会调用该区块。有关如何报告更改的信息以及更新UITableView的示例,请参阅RLMCollectionChange文档。

    存在错误参数只是为了向后兼容,并且将始终为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(RLMArray<Dog *> *dogs,
                                                   RLMCollectionChange *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 addObject:dog];
    }];
    // end of run loop execution context
    

    只要您希望继续将更新发送到区块,就必须保留返回的令牌。 要停止接收更新,请对令牌调用-invalidate

    警告

    在写事务(write transaction)期间或当包含的 Realm 为只读时,无法调用此方法。

    警告

    此方法只能在非冻结托管数组上调用。

    声明

    Objective-C

    - (nonnull RLMNotificationToken *)addNotificationBlock:
        (nonnull void (^)(RLMArray<RLMObjectType> *_Nullable,
                          RLMCollectionChange *_Nullable, NSError *_Nullable))block;

    Swift

    func addNotificationBlock(_ block: @escaping (RLMArray<RLMObjectType>?, RLMCollectionChange?, (any Error)?) -> Void) -> RLMNotificationToken

    参数

    block

    每次数组更改时要调用的区块。

    返回值

    只要您希望传递更新,就必须持有的令牌。

  • 注册一个区块,以便在每次数组更改时调用。

    该区块将与初始数组一起异步调用,然后在每次写事务(write transaction)后再次调用,这会更改数组中的任何对象、结果中的对象或数组中对象的顺序。

    首次调用该区块时, changes参数将为nil 。 对于此后的每次调用,它将包含有关在数组中添加、删除或修改了哪些行的信息。 如果写事务(write transaction)未修改数组中的任何对象,则根本不会调用该区块。有关如何报告更改的信息以及更新UITableView的示例,请参阅RLMCollectionChange文档。

    存在错误参数只是为了向后兼容,并且将始终为nil

    通知将传递到给定队列。 如果队列阻塞且无法立即传递通知,则多个通知可能会合并为一个通知。

    只要您希望继续将更新发送到区块,就必须保留返回的令牌。 要停止接收更新,请对令牌调用-invalidate

    警告

    当包含的 Realm 处于只读或冻结状态时,无法调用此方法。

    警告

    该队列必须是串行队列。

    声明

    Objective-C

    - (nonnull RLMNotificationToken *)
        addNotificationBlock:(nonnull void (^)(RLMArray<RLMObjectType> *_Nullable,
                                               RLMCollectionChange *_Nullable,
                                               NSError *_Nullable))block
                       queue:(nullable dispatch_queue_t)queue;

    Swift

    func addNotificationBlock(_ block: @escaping (RLMArray<RLMObjectType>?, RLMCollectionChange?, (any Error)?) -> Void, queue: dispatch_queue_t?) -> RLMNotificationToken

    参数

    block

    发生更改时要调用的区块。

    queue

    要向其传递通知的串行队列。

    返回值

    只要您希望传递更新,就必须持有的令牌。

  • 注册一个区块,以便在每次数组更改时调用。

    该区块将与初始数组一起异步调用,然后在每次写事务(write transaction)后再次调用,这会更改数组中的任何对象、结果中的对象或数组中对象的顺序。

    首次调用该区块时, changes参数将为nil 。 对于此后的每次调用,它将包含有关在数组中添加、删除或修改了哪些行的信息。 如果写事务(write transaction)未修改数组中的任何对象,则根本不会调用该区块。有关如何报告更改的信息以及更新UITableView的示例,请参阅RLMCollectionChange文档。

    存在错误参数只是为了向后兼容,并且将始终为nil

    通知将传递到给定队列。 如果队列阻塞且无法立即传递通知,则多个通知可能会合并为一个通知。

    只要您希望继续将更新发送到区块,就必须保留返回的令牌。 要停止接收更新,请对令牌调用-invalidate

    警告

    当包含的 Realm 处于只读或冻结状态时,无法调用此方法。

    警告

    该队列必须是串行队列。

    声明

    Objective-C

    - (nonnull RLMNotificationToken *)
        addNotificationBlock:(nonnull void (^)(RLMArray<RLMObjectType> *_Nullable,
                                               RLMCollectionChange *_Nullable,
                                               NSError *_Nullable))block
                    keyPaths:(nullable NSArray<NSString *> *)keyPaths
                       queue:(nullable dispatch_queue_t)queue;

    Swift

    func addNotificationBlock(_ block: @escaping (RLMArray<RLMObjectType>?, RLMCollectionChange?, (any Error)?) -> Void, keyPaths: [String]?, queue: dispatch_queue_t?) -> RLMNotificationToken

    参数

    block

    发生更改时要调用的区块。

    keyPaths

    这些键路径上发生的更改将调用该区块。 如果未给出键路径,则为每个属性键路径传递通知。

    queue

    要向其传递通知的串行队列。

    返回值

    只要您希望传递更新,就必须持有的令牌。

  • 注册一个区块,以便在每次数组更改时调用。

    该区块将与初始数组一起异步调用,然后在每次写事务(write transaction)后再次调用,这会更改数组中的任何对象、结果中的对象或数组中对象的顺序。

    首次调用该区块时, changes参数将为nil 。 对于此后的每次调用,它将包含有关在数组中添加、删除或修改了哪些行的信息。 如果写事务(write transaction)未修改数组中的任何对象,则根本不会调用该区块。有关如何报告更改的信息以及更新UITableView的示例,请参阅RLMCollectionChange文档。

    存在错误参数只是为了向后兼容,并且将始终为nil

    通知是通过标准事件循环传递的,因此当事件循环被其他活动阻止时无法传递。当无法立即传递通知时,可以将多个通知合并为一个通知。 这可以包括带有初始结果的通知。 例如,以下代码在添加通知块后立即执行写事务(write transaction),因此没有机会首先传递初始通知。因此,初始通知将反映写事务(write transaction)后 Realm 的状态。

    只要您希望继续将更新发送到区块,就必须保留返回的令牌。 要停止接收更新,请对令牌调用-invalidate

    警告

    当包含的 Realm 处于只读或冻结状态时,无法调用此方法。

    警告

    该队列必须是串行队列。

    声明

    Objective-C

    - (nonnull RLMNotificationToken *)
        addNotificationBlock:(nonnull void (^)(RLMArray<RLMObjectType> *_Nullable,
                                               RLMCollectionChange *_Nullable,
                                               NSError *_Nullable))block
                    keyPaths:(nullable NSArray<NSString *> *)keyPaths;

    Swift

    func addNotificationBlock(_ block: @escaping (RLMArray<RLMObjectType>?, RLMCollectionChange?, (any Error)?) -> Void, keyPaths: [String]?) -> RLMNotificationToken

    参数

    block

    发生更改时要调用的区块。

    keyPaths

    这些键路径上发生的更改将调用该区块。 如果未给出键路径,则为每个属性键路径传递通知。

    返回值

    只要您希望传递更新,就必须持有的令牌。

聚合属性值

  • 返回数组中所有对象中给定属性的最小值。

    NSNumber *min = [object.arrayProperty minOfProperty:@"age"];
    

    警告

    您不能在RLMObjectRLMArrayNSData属性上使用此方法。

    声明

    Objective-C

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

    Swift

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

    参数

    property

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

    返回值

    该属性的最小值;如果数组为空,则为nil

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

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

    警告

    您不能在RLMObjectRLMArrayNSData属性上使用此方法。

    声明

    Objective-C

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

    Swift

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

    参数

    property

    需要获取最大值的属性。 仅支持类型为intfloatdoubleNSDate的属性。

    返回值

    该属性的最大值,如果数组为空,则为nil

  • 返回数组中所有对象的给定属性值的总和。

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

    警告

    您不能在RLMObjectRLMArrayNSData属性上使用此方法。

    声明

    Objective-C

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

    Swift

    func sum(ofProperty property: String) -> NSNumber

    参数

    property

    应对其值求和的属性。 仅支持类型为intfloatdouble的属性。

    返回值

    给定属性的总和。

  • 返回数组中对象的给定属性的平均值。

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

    警告

    您不能在RLMObjectRLMArrayNSData属性上使用此方法。

    声明

    Objective-C

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

    Swift

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

    参数

    property

    应计算其平均值的属性。 仅支持类型为intfloatdouble的属性。

    返回值

    给定属性的平均值,如果数组为空,则为nil

冻结

  • 返回此数组的冻结(不可变)快照。

    冻结副本是一个不可变数组,其中包含与该数组当前包含的数据相同的数据,但在写入包含的 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

不可用的方法

  • 不可用

    无法直接创建 RLMArray

    -[RLMArray init] 不可用,因为无法直接创建RLMArrayRLMArrayRLMObject上的 属性是在访问时延迟创建的。

    声明

    Objective-C

    - (nonnull instancetype)init;
  • 不可用

    无法直接创建 RLMArray

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

    声明

    Objective-C

    + (nonnull instancetype)new;