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
可以使用与RLMObject
和RLMResult
相同的谓词进行查询。
RLMArray
s 不能直接创建。 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 }
-
指示是否无法再访问该数组。
声明
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
一个可枚举对象,例如
NSArray
或RLMResults
,其中包含与数组同一类的对象。 -
在给定索引处插入一个对象。
如果索引超出数组边界,则会引发异常。
警告
此方法只能在写事务(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
。
-
从给定属性键路径对此集合进行排序和分段,并以
RLMSectionedResults
的实例形式返回结果。声明
Objective-C
- (nonnull RLMSectionedResults *) sectionedResultsSortedUsingKeyPath:(nonnull NSString *)keyPath ascending:(BOOL)ascending keyBlock: (nonnull RLMSectionedResultsKeyBlock)keyBlock;
Swift
func sectionedResultsSorted(usingKeyPath keyPath: String, ascending: Bool, keyBlock: @escaping RLMSectionedResultsKeyBlock) -> RLMSectionedResults
参数
keyPath
排序所依据的属性键路径。
ascending
排序的方向。
keyBlock
对 Results collection中的每个元素调用的回调。此回调将返回集合中元素的部分键。
返回值
RLMectionedResults 的实例。
-
RLMSectionedResults
根据给定的排序描述符数组对此collection进行排序和分段,并以实例的实例形式返回结果。注意
主排序描述符必须负责确定节键。
声明
Objective-C
- (nonnull RLMSectionedResults *) sectionedResultsUsingSortDescriptors: (nonnull NSArray<RLMSortDescriptor *> *)sortDescriptors keyBlock:(nonnull RLMSectionedResultsKeyBlock) keyBlock;
Swift
func sectionedResults(using sortDescriptors: [RLMSortDescriptor], keyBlock: @escaping RLMSectionedResultsKeyBlock) -> RLMSectionedResults
参数
sortDescriptors
要排序的
RLMSortDescriptor
数组。keyBlock
对 Results collection中的每个元素调用的回调。此回调将返回集合中元素的部分键。
返回值
RLMectionedResults 的实例。
-
注册一个区块,以便在每次数组更改时调用。
该区块将与初始数组一起异步调用,然后在每次写事务(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"];
警告
您不能在
RLMObject
、RLMArray
和NSData
属性上使用此方法。声明
Objective-C
- (nullable id)minOfProperty:(nonnull NSString *)property;
Swift
func min(ofProperty property: String) -> Any?
参数
property
需要其最小值的属性。 仅支持类型为
int
、float
、double
和NSDate
的属性。返回值
该属性的最小值;如果数组为空,则为
nil
。 -
返回数组中所有对象中给定属性的最大值。
NSNumber *max = [object.arrayProperty maxOfProperty:@"age"];
警告
您不能在
RLMObject
、RLMArray
和NSData
属性上使用此方法。声明
Objective-C
- (nullable id)maxOfProperty:(nonnull NSString *)property;
Swift
func max(ofProperty property: String) -> Any?
参数
property
需要获取最大值的属性。 仅支持类型为
int
、float
、double
和NSDate
的属性。返回值
该属性的最大值,如果数组为空,则为
nil
。 -
返回数组中所有对象的给定属性值的总和。
NSNumber *sum = [object.arrayProperty sumOfProperty:@"age"];
警告
您不能在
RLMObject
、RLMArray
和NSData
属性上使用此方法。声明
Objective-C
- (nonnull NSNumber *)sumOfProperty:(nonnull NSString *)property;
Swift
func sum(ofProperty property: String) -> NSNumber
参数
property
应对其值求和的属性。 仅支持类型为
int
、float
和double
的属性。返回值
给定属性的总和。
-
返回数组中对象的给定属性的平均值。
NSNumber *average = [object.arrayProperty averageOfProperty:@"age"];
警告
您不能在
RLMObject
、RLMArray
和NSData
属性上使用此方法。声明
Objective-C
- (nullable NSNumber *)averageOfProperty:(nonnull NSString *)property;
Swift
func average(ofProperty property: String) -> NSNumber?
参数
property
应计算其平均值的属性。 仅支持类型为
int
、float
和double
的属性。返回值
给定属性的平均值,如果数组为空,则为
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