RealmSectionedResult
public protocol RealmSectionedResult : ThreadConfined, Equatable, RandomAccessCollection
RealmSectionedResult
定义了SectionedResults
和ResultSection
共有的属性和方法。
-
管理集合的 Realm,如果集合无效,则为
nil
。声明
Swift
var realm: Realm? { get }
-
指示是否无法再访问该collection。
如果对管理集合的
Realm
调用了invalidate()
,则无法再访问该集合。声明
Swift
var isInvalidated: Bool { get }
-
collection中的对象的数量。
声明
Swift
var count: Int { get }
-
如果此collection已冻结,则返回 true
声明
Swift
var isFrozen: Bool { get }
-
返回此collection的冻结(不可变)快照。
冻结副本是一个不可变的collection,其中包含与该collection当前包含的数据相同的数据,但在写入包含的 Realm 时不会更新。与实时集合不同,冻结集合可以从任何线程访问。
警告
在写事务(write transaction)期间或当包含的 Realm 为只读时,无法调用此方法。警告
在 Realm 上执行写事务(write transaction)时长时间持有冻结的 collection 可能会导致 Realm 文件过大。有关更多信息,请参阅Realm.Configuration.maximumNumberOfActiveVersions
。声明
Swift
func freeze() -> Self
-
返回此冻结collection的活动(可变)版本。
此方法解析对同一冻结collection的实时副本的引用。如果在实时collection上调用,则返回自身。
声明
Swift
func thaw() -> Self?
-
注册一个区块,以便在每次分段结果集合发生更改时调用。
该区块将与初始分片结果集合一起异步调用,然后在每次写入事务后再次调用,这会更改分片结果集合中的任何对象,或者分片结果集合中的哪些对象。
传递给区块的
change
参数以collection内索引的形式报告在每个写事务(write transaction)期间添加、删除或修改了哪些对象。有关所提供变更信息的更多信息,以及如何使用这些信息来更新UITableView
的示例,请参阅SectionedResultsChange
文档。调用区块时,collection将进行全面求值且是最新的,只要不在同一线程上执行写事务(write transaction)或显式调用
realm.refresh()
,访问该collection就永远不会执行阻塞工作。如果未指定队列,则将通过标准运行循环传递通知,因此当运行循环被其他活动阻塞时无法传递通知。 如果给出了队列,则将通知传递到该队列。 当无法立即传递通知时,可以将多个通知合并为一个通知。 这可以包括带有初始分段结果集合的通知。
例如,以下代码在添加通知块后立即执行写事务(write transaction),因此没有机会首先传递初始通知。因此,初始通知将反映写事务后 Realm 的状态。
let dogs = realm.objects(Dog.self) let sectionedResults = dogs.sectioned(by: \.age, ascending: true) print("sectionedResults.count: \(sectionedResults?.count)") // => 0 let token = sectionedResults.observe { changes in switch changes { case .initial(let sectionedResults): // Will print "sectionedResults.count: 1" print("sectionedResults.count: \(sectionedResults.count)") break case .update: // Will not be hit in this example break case .error: break } } try! realm.write { let dog = Dog() dog.name = "Rex" person.dogs.append(dog) } // end of run loop execution context
如果未给出键路径,则在所有对象属性以及任何嵌套、链接对象的属性的任何插入、修改或删除操作时都会执行该区块。 如果提供了一个或多个关键路径,则将调用该区块以进行仅在所提供的关键路径上发生的更改。 例如,如果:
class Dog: Object { @Persisted var name: String @Persisted var age: Int @Persisted var toys: List<Toy> } // ... let dogs = realm.objects(Dog.self) let sectionedResults = dogs.sectioned(by: \.age, ascending: true) let token = sectionedResults.observe(keyPaths: ["name"]) { changes in switch changes { case .initial(let sectionedResults): // ... case .update: // This case is hit: // - after the token is initialized // - when the name property of an object in the // collection is modified // - when an element is inserted or removed // from the collection. // This block is not triggered: // - when a value other than name is modified on // one of the elements. case .error: // ... } } // end of run loop execution context
- 如果观察到的键路径为
["toys.brand"]
,则对collection任何元素上的toys
列表进行的任何插入或删除操作都会trigger该区块。 对链接到此collection中的Dog
的任何Toy
的brand
值进行更改都会trigger该区块。在链接到此collection中的Dog
的任何Toy
上,对brand
以外的值进行更改都不会trigger该区块。对所观察到的Dog
类型collection的任何插入或删除也会trigger通知。 - 如果在上面的示例中观察到了
["toys"]
键路径,那么针对集合中的任何元素对toys
列表进行的任何插入、删除或修改都会触发区块。 对链接到此collection中的Dog
的任何Toy
的任何值进行更改都不会trigger该区块。对正在观察的Dog
类型集合的任何插入或删除仍会触发通知。 对部分键路径属性的任何修改会导致对象更改在部分中的位置或完全更改部分,都会trigger通知。
注意
同一对象上的多个通知令牌(针对单独的键路径进行过滤)不会进行排他性过滤。如果一项键路径变更符合一个通知令牌的条件,则该对象的所有通知令牌块都将执行。
只要您希望将更新发送到区块,就必须保留返回的令牌。 要停止接收更新,请对令牌调用
invalidate()
。警告
在写事务(write transaction)期间或当包含的 Realm 为只读时,无法调用此方法。
默认实现
声明
Swift
func observe(keyPaths: [String]?, on queue: DispatchQueue?, _ block: @escaping (SectionedResultsChange<Self>) -> Void) -> NotificationToken
参数
keyPaths
只有键路径数组中包含的属性在修改时才会触发区块。 如果为
nil
,则对象上的任何属性更改都会发送通知。 与有效属性不对应的字符串键路径将引发异常。 有关关联属性的更多详细信息,请参阅上述描述。queue
用于接收通知的串行调度队列。 如果为
nil
,则通知将传递到当前线程。block
发生更改时要调用的区块。
返回值
只要您希望传递更新,就必须持有的令牌。
- 如果观察到的键路径为
-
默认实现
注册一个区块,以便在每次分段结果集合发生更改时调用。
该区块将与初始分片结果集合一起异步调用,然后在每次写入事务后再次调用,这会更改分片结果集合中的任何对象,或者分片结果集合中的哪些对象。
传递给区块的
change
参数以collection内索引的形式报告在每个写事务(write transaction)期间添加、删除或修改了哪些对象。有关所提供变更信息的更多信息,以及如何使用这些信息来更新UITableView
的示例,请参阅SectionedResultsChange
文档。调用区块时,collection将进行全面求值且是最新的,只要不在同一线程上执行写事务(write transaction)或显式调用
realm.refresh()
,访问该collection就永远不会执行阻塞工作。如果未指定队列,则将通过标准运行循环传递通知,因此当运行循环被其他活动阻塞时无法传递通知。 如果给出了队列,则将通知传递到该队列。 当无法立即传递通知时,可以将多个通知合并为一个通知。 这可以包括带有初始分段结果集合的通知。
例如,以下代码在添加通知块后立即执行写事务(write transaction),因此没有机会首先传递初始通知。因此,初始通知将反映写事务后 Realm 的状态。
let dogs = realm.objects(Dog.self) let sectionedResults = dogs.sectioned(by: \.age, ascending: true) print("sectionedResults.count: \(sectionedResults?.count)") // => 0 let token = sectionedResults.observe { changes in switch changes { case .initial(let sectionedResults): // Will print "sectionedResults.count: 1" print("sectionedResults.count: \(sectionedResults.count)") break case .update: // Will not be hit in this example break case .error: break } } try! realm.write { let dog = Dog() dog.name = "Rex" person.dogs.append(dog) } // end of run loop execution context
如果未给出键路径,则在所有对象属性以及任何嵌套、链接对象的属性的任何插入、修改或删除操作时都会执行该区块。 如果提供了一个或多个关键路径,则将调用该区块以进行仅在所提供的关键路径上发生的更改。 例如,如果:
class Dog: Object { @Persisted var name: String @Persisted var age: Int @Persisted var toys: List<Toy> } // ... let dogs = realm.objects(Dog.self) let sectionedResults = dogs.sectioned(by: \.age, ascending: true) let token = sectionedResults.observe(keyPaths: ["name"]) { changes in switch changes { case .initial(let sectionedResults): // ... case .update: // This case is hit: // - after the token is initialized // - when the name property of an object in the // collection is modified // - when an element is inserted or removed // from the collection. // This block is not triggered: // - when a value other than name is modified on // one of the elements. case .error: // ... } } // end of run loop execution context
- 如果观察到的键路径为
["toys.brand"]
,则对collection任何元素上的toys
列表进行的任何插入或删除操作都会trigger该区块。 对链接到此collection中的Dog
的任何Toy
的brand
值进行更改都会trigger该区块。在链接到此collection中的Dog
的任何Toy
上,对brand
以外的值进行更改都不会trigger该区块。对所观察到的Dog
类型collection的任何插入或删除也会trigger通知。 - 如果在上面的示例中观察到了
["toys"]
键路径,那么针对集合中的任何元素对toys
列表进行的任何插入、删除或修改都会触发区块。 对链接到此collection中的Dog
的任何Toy
的任何值进行更改都不会trigger该区块。对正在观察的Dog
类型集合的任何插入或删除仍会触发通知。 对部分键路径属性的任何修改会导致对象更改在部分中的位置或完全更改部分,都会trigger通知。
注意
同一对象上的多个通知令牌(针对单独的键路径进行过滤)不会进行排他性过滤。如果一项键路径变更符合一个通知令牌的条件,则该对象的所有通知令牌块都将执行。
只要您希望将更新发送到区块,就必须保留返回的令牌。 要停止接收更新,请对令牌调用
invalidate()
。警告
在写事务(write transaction)期间或当包含的 Realm 为只读时,无法调用此方法。
声明
Swift
func observe(keyPaths: [PartialKeyPath<Element.Element>], on queue: DispatchQueue? = nil, _ block: @escaping (SectionedResultsChange<Self>) -> Void) -> NotificationToken
参数
keyPaths
只有键路径数组中包含的属性在修改时才会trigger区块。 如果为
nil
,则对象上的任何属性更改都会发送通知。queue
用于接收通知的串行调度队列。 如果为
nil
,则通知将传递到当前线程。block
发生更改时要调用的区块。
返回值
只要您希望传递更新,就必须持有的令牌。
- 如果观察到的键路径为
-
默认实现
注册一个区块,以便在每次分段结果集合发生更改时调用。
该区块将与初始分片结果集合一起异步调用,然后在每次写入事务后再次调用,这会更改分片结果集合中的任何对象,或者分片结果集合中的哪些对象。
传递给区块的
change
参数以collection内索引的形式报告在每个写事务(write transaction)期间添加、删除或修改了哪些对象。有关所提供变更信息的更多信息,以及如何使用这些信息来更新UITableView
的示例,请参阅SectionedResultsChange
文档。调用区块时,collection将进行全面求值且是最新的,只要不在同一线程上执行写事务(write transaction)或显式调用
realm.refresh()
,访问该collection就永远不会执行阻塞工作。如果未指定队列,则将通过标准运行循环传递通知,因此当运行循环被其他活动阻塞时无法传递通知。 如果给出了队列,则将通知传递到该队列。 当无法立即传递通知时,可以将多个通知合并为一个通知。 这可以包括带有初始分段结果集合的通知。
例如,以下代码在添加通知块后立即执行写事务(write transaction),因此没有机会首先传递初始通知。因此,初始通知将反映写事务后 Realm 的状态。
let dogs = realm.objects(Dog.self) let sectionedResults = dogs.sectioned(by: \.age, ascending: true) print("sectionedResults.count: \(sectionedResults?.count)") // => 0 let token = sectionedResults.observe { changes in switch changes { case .initial(let sectionedResults): // Will print "sectionedResults.count: 1" print("sectionedResults.count: \(sectionedResults.count)") break case .update: // Will not be hit in this example break case .error: break } } try! realm.write { let dog = Dog() dog.name = "Rex" person.dogs.append(dog) } // end of run loop execution context
如果未给出键路径,则在所有对象属性以及任何嵌套、链接对象的属性的任何插入、修改或删除操作时都会执行该区块。 如果提供了一个或多个关键路径,则将调用该区块以进行仅在所提供的关键路径上发生的更改。 例如,如果:
class Dog: Object { @Persisted var name: String @Persisted var age: Int @Persisted var toys: List<Toy> } // ... let dogs = realm.objects(Dog.self) let sectionedResults = dogs.sectioned(by: \.age, ascending: true) let token = sectionedResults.observe(keyPaths: ["name"]) { changes in switch changes { case .initial(let sectionedResults): // ... case .update: // This case is hit: // - after the token is initialized // - when the name property of an object in the // collection is modified // - when an element is inserted or removed // from the collection. // This block is not triggered: // - when a value other than name is modified on // one of the elements. case .error: // ... } } // end of run loop execution context
- 如果观察到的键路径为
["toys.brand"]
,则对collection任何元素上的toys
列表进行的任何插入或删除操作都会trigger该区块。 对链接到此collection中的Dog
的任何Toy
的brand
值进行更改都会trigger该区块。在链接到此collection中的Dog
的任何Toy
上,对brand
以外的值进行更改都不会trigger该区块。对所观察到的Dog
类型collection的任何插入或删除也会trigger通知。 - 如果在上面的示例中观察到了
["toys"]
键路径,那么针对集合中的任何元素对toys
列表进行的任何插入、删除或修改都会触发区块。 对链接到此collection中的Dog
的任何Toy
的任何值进行更改都不会trigger该区块。对正在观察的Dog
类型集合的任何插入或删除仍会触发通知。 对部分键路径属性的任何修改会导致对象更改在部分中的位置或完全更改部分,都会trigger通知。
注意
同一对象上的多个通知令牌(针对单独的键路径进行过滤)不会进行排他性过滤。如果一项键路径变更符合一个通知令牌的条件,则该对象的所有通知令牌块都将执行。
只要您希望将更新发送到区块,就必须保留返回的令牌。 要停止接收更新,请对令牌调用
invalidate()
。警告
在写事务(write transaction)期间或当包含的 Realm 为只读时,无法调用此方法。
声明
Swift
func observe(keyPaths: [PartialKeyPath<Element>], on queue: DispatchQueue? = nil, _ block: @escaping (SectionedResultsChange<Self>) -> Void) -> NotificationToken
参数
keyPaths
只有键路径数组中包含的属性在修改时才会trigger区块。 如果为
nil
,则对象上的任何属性更改都会发送通知。queue
用于接收通知的串行调度队列。 如果为
nil
,则通知将传递到当前线程。block
发生更改时要调用的区块。
返回值
只要您希望传递更新,就必须持有的令牌。
- 如果观察到的键路径为