RealmSectionedResult

public protocol RealmSectionedResult : ThreadConfined, Equatable, RandomAccessCollection

RealmSectionedResult 定义了SectionedResultsResultSection共有的属性和方法。

属性

  • 管理集合的 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的任何Toybrand值进行更改都会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

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

    返回值

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

Element : RealmSectionedResultElement.Element : ObjectBase的情况下可用

  • 默认实现

    注册一个区块,以便在每次分段结果集合发生更改时调用。

    该区块将与初始分片结果集合一起异步调用,然后在每次写入事务后再次调用,这会更改分片结果集合中的任何对象,或者分片结果集合中的哪些对象。

    传递给区块的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的任何Toybrand值进行更改都会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

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

    返回值

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

适用于以下位置: ElementObjectBase

  • 默认实现

    注册一个区块,以便在每次分段结果集合发生更改时调用。

    该区块将与初始分片结果集合一起异步调用,然后在每次写入事务后再次调用,这会更改分片结果集合中的任何对象,或者分片结果集合中的哪些对象。

    传递给区块的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的任何Toybrand值进行更改都会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

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

    返回值

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