RealmKeyedCollection

public protocol RealmKeyedCollection : ThreadConfined, CustomStringConvertible, Sequence

可以检索、筛选、排序和操作的Object的同质键值collection。

属性

变更

  • 更新存储在字典中的给定键的值,如果键不存在,则添加新的键值对。

    注意

    注意:如果添加到字典中的值是非托管对象,而字典是托管对象,则该非托管对象将添加到 Realm 中。

    警告

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

    声明

    迅速

    func updateValue(_ value: Value, forKey key: Key)

    参数

    value

    值的键路径谓词。

    forKey

    排序的方向。

  • 仅当字典中存在给定键时,才删除该键及其关联对象。如果键不存在,则不会修改字典。

    警告

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

    声明

    迅速

    func removeObject(for key: Key)
  • 从字典中删除所有对象。对象不会从托管它们的 Realm 中删除。

    警告

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

    声明

    迅速

    func removeAll()
  • 返回给定键的值,或者在下标用于分配时为键设置值。

    注意

    注意:如果添加到字典中的值是非托管对象,而字典是托管对象,则该非托管对象将添加到 Realm 中。

    注意

    注意:如果为某个键分配的值为nil ,则该键将从字典中删除。

    警告

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

    声明

    迅速

    subscript(key: Key) -> Value? { get set }

    参数

    key

    密钥。

KVC

  • 如果指定键存在于地图中,则返回其Value类型。

    请注意,使用键值编码时,键必须是字符串。

    声明

    迅速

    func value(forKey key: String) -> AnyObject?

    参数

    key

    所需值的属性的键。

  • 如果指定键存在于地图中,则返回其Value类型。

    声明

    迅速

    func value(forKeyPath keyPath: String) -> AnyObject?

    参数

    keyPath

    所需值的属性的键。

  • 将给定的键值对添加到字典中,或更新给定的键(如果已存在)。

    警告

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

    声明

    迅速

    func setValue(_ value: Any?, forKey key: String)

    参数

    value

    对象值。

    key

    应在每个对象上设置其值的属性的名称。

过滤

  • 返回一个Results ,其中包含字典中与给定谓词匹配的所有值。

    注意

    这将返回字典中的值,而不是键值对。

    声明

    迅速

    func filter(_ predicate: NSPredicate) -> Results<Value>

    参数

    predicate

    用于筛选值的谓词。

  • 返回一个布尔值,指示 Map 是否包含满足给定谓词的键值对

    声明

    迅速

    func contains(where predicate: @escaping (_ key: Key, _ value: Value) -> Bool) -> Bool

    参数

    where

    一个闭包,用于测试给定映射的任何键对是否表示匹配项。

排序

  • 返回包含字典中对象的Results ,但已排序。

    对象根据其值进行排序。例如,要对Date字典进行从新到旧的排序,您可以调用dates.sorted(ascending: true)

    声明

    迅速

    func sorted(ascending: Bool) -> Results<Value>

    参数

    ascending

    排序的方向。

  • 返回包含字典中对象的Results ,但已排序。

    对象根据给定键路径的值进行排序。例如,要根据age属性对Student字典从新到旧进行排序,您可以调用students.sorted(byKeyPath: "age", ascending: true)

    警告

    字典只能按布尔值、 DateNSDate 、单精度和双精度浮点、整数和字符串类型的属性进行排序。

    声明

    迅速

    func sorted(byKeyPath keyPath: String, ascending: Bool) -> Results<Value>

    参数

    keyPath

    排序依据的键路径。

    ascending

    排序的方向。

  • 返回包含字典中对象的Results ,但已排序。

    警告

    字典只能按布尔值、 DateNSDate 、单精度和双精度浮点、整数和字符串类型的属性进行排序。

    声明

    迅速

    func sorted<S: Sequence>(by sortDescriptors: S) -> Results<Value>
        where S.Iterator.Element == SortDescriptor
  • 返回此字典中的所有键。

    声明

    迅速

    var keys: [Key] { get }
  • 返回字典中的所有值。

    声明

    迅速

    var values: [Value] { get }

聚合操作

  • 返回collection中所有对象的给定属性的最小值,如果字典为空,则返回nil

    警告

    只能指定类型符合MinMaxType协议的属性。

    声明

    迅速

    func min<T>(ofProperty property: String) -> T? where T : _HasPersistedType, T.PersistedType : MinMaxType

    参数

    property

    所需最小值的属性名称。

  • 返回字典中所有对象中给定属性的最大值,如果字典为空,则返回nil

    警告

    只能指定类型符合MinMaxType协议的属性。

    声明

    迅速

    func max<T>(ofProperty property: String) -> T? where T : _HasPersistedType, T.PersistedType : MinMaxType

    参数

    property

    所需最小值的属性名称。

  • 返回字典中对象的给定属性的总和,如果字典为空,则返回nil

    警告

    只能使用符合AddableType协议的类型的属性名称。

    声明

    迅速

    func sum<T>(ofProperty property: String) -> T where T : _HasPersistedType, T.PersistedType : AddableType

    参数

    property

    符合AddableType的属性名称,用于计算总和。

  • 返回字典中所有对象的给定属性的平均值,如果字典为空,则返回nil

    警告

    只能指定类型符合AddableType协议的属性。

    声明

    迅速

    func average<T>(ofProperty property: String) -> T? where T : _HasPersistedType, T.PersistedType : AddableType

    参数

    property

    应对其值求和的属性的名称。

通知

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

    该区块将与初始字典一起异步调用,然后在每次更改字典中任何键或值的写事务(write transaction)后再次调用。

    传递给区块的change参数以字典中键的形式报告在每个写事务期间添加、删除或修改了哪些键值对。

    在调用区块时,字典将被完全评估并保持最新状态,只要您不在同一线程上执行写事务(write transaction)或显式调用realm.refresh() ,访问它就永远不会执行阻塞工作。

    如果未指定队列,则将通过标准事件循环传递通知,因此当事件循环被其他活动阻塞时无法传递通知。如果给出了队列,则将通知传递到该队列。 当无法立即传递通知时,可以将多个通知合并为一个通知。 这可以包括初始collection的通知。

    例如,以下代码在添加通知块后立即执行写事务(write transaction),因此没有机会首先传递初始通知。因此,初始通知将反映写事务后 Realm 的状态。

    let myStringMap = myObject.stringMap
    print("myStringMap.count: \(myStringMap?.count)") // => 0
    let token = myStringMap.observe { changes in
        switch changes {
        case .initial(let myStringMap):
            // Will print "myStringMap.count: 1"
            print("myStringMap.count: \(myStringMap.count)")
           print("Dog Name: \(myStringMap["nameOfDog"])") // => "Rex"
            break
        case .update:
            // Will not be hit in this example
            break
        case .error:
            break
        }
    }
    try! realm.write {
        myStringMap["nameOfDog"] = "Rex"
    }
    // end of run loop execution context
    

    如果未给出键路径,则在所有对象属性以及任何嵌套、链接对象的属性的任何插入、修改或删除操作时都会执行该区块。 如果提供了一个或多个关键路径,则将调用该区块以进行仅在所提供的关键路径上发生的更改。 例如,如果:

    class Dog: Object {
        @Persisted var name: String
        @Persisted var age: Int
        @Persisted var toys: List<Toy>
    }
    // ...
    let dogs = myObject.mapOfDogs
    let token = dogs.observe(keyPaths: ["name"]) { changes in
        switch changes {
        case .initial(let dogs):
           // ...
        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类型集合的任何插入或删除仍会触发通知。

    注意

    同一对象上的多个通知令牌(针对单独的键路径进行过滤)不会进行排他性过滤。如果一项键路径变更符合一个通知令牌的条件,则该对象的所有通知令牌块都将执行。

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

    警告

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

    注意

    keyPaths 参数是指集合类型的对象属性,而不是集合中的特定键/值对。

    默认实现

    声明

    迅速

    func observe(keyPaths: [String]?,
                 on queue: DispatchQueue?,
                 _ block: @escaping (RealmMapChange<Self>) -> Void) -> NotificationToken

    参数

    keyPaths

    只有键路径数组中包含的属性在修改时才会触发区块。 如果为nil ,则对象上的任何属性更改都会发送通知。 与有效属性不对应的字符串键路径将引发异常。 有关关联属性的更多详细信息,请参阅上述描述。

    queue

    用于接收通知的串行调度队列。 如果为nil ,则通知将传递到当前线程。

    block

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

    返回值

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

冻结对象

  • 如果此collection已冻结,则返回

    声明

    迅速

    var isFrozen: Bool { get }
  • 返回此collection的冻结(不可变)快照。

    冻结副本是一个不可变的collection,其中包含与该collection当前包含的数据相同的数据,但在写入包含的 Realm 时不会更新。与实时集合不同,冻结集合可以从任何线程访问。

    警告

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

    警告

    在 Realm 上执行写事务(write transaction)时长时间持有冻结的 collection 可能会导致 Realm 文件过大。有关更多信息,请参阅Realm.Configuration.maximumNumberOfActiveVersions

    声明

    迅速

    func freeze() -> Self
  • 返回此冻结collection的活动(可变)版本。

    此方法解析对同一冻结collection的实时副本的引用。如果在实时collection上调用,则返回自身。

    声明

    迅速

    func thaw() -> Self?

适用于以下位置: SelfRealmSubscribable

Value : OptionalProtocolValue.Wrapped : ObjectBase的情况下可用

  • min(of:) 扩展方法

    返回集合中所有对象中给定属性的最小值,如果集合为空,则返回nil

    警告

    只能指定类型符合MinMaxType协议的属性。

    声明

    迅速

    func min<T>(of keyPath: KeyPath<Value.Wrapped, T>) -> T? where T : _HasPersistedType, T.PersistedType : MinMaxType

    参数

    keyPath

    所需属性的 keyPath。

  • max(of:) 扩展方法

    返回集合中所有对象中给定属性的最大值,如果集合为空,则返回nil

    警告

    只能指定类型符合MinMaxType协议的属性。

    声明

    迅速

    func max<T>(of keyPath: KeyPath<Value.Wrapped, T>) -> T? where T : _HasPersistedType, T.PersistedType : MinMaxType

    参数

    keyPath

    所需属性的 keyPath。

  • sum(of:) 扩展方法

    返回集合中对象的给定属性的总和,如果集合为空,则返回nil

    警告

    只能使用符合AddableType协议的类型的属性名称。

    声明

    迅速

    func sum<T>(of keyPath: KeyPath<Value.Wrapped, T>) -> T where T : _HasPersistedType, T.PersistedType : AddableType

    参数

    keyPath

    符合AddableType的属性的 keyPath 来计算总和。

  • average(of:) 扩展方法

    返回集合中所有对象的给定属性的平均值,如果集合为空,则返回nil

    警告

    只能指定类型符合AddableType协议的属性。

    声明

    迅速

    func average<T>(of keyPath: KeyPath<Value.Wrapped, T>) -> T? where T : _HasPersistedType, T.PersistedType : AddableType

    参数

    keyPath

    应对其值求和的属性的 keyPath。

在以下情况下可用: Value : OptionalProtocolValue.Wrapped : ObjectBaseValue.Wrapped : RealmCollectionValue

  • sorted(by:ascending:) 扩展方法

    返回包含collection中的对象的Results ,但已排序。

    对象根据给定键路径的值进行排序。 例如,要根据Student age属性对collection从新到旧进行排序,您可以调用students.sorted(byKeyPath: "age", ascending: true)

    警告

    collection只能按boolean、 DateNSDate 、单精度和双精度浮点、整数和字符串类型的属性进行排序。

    声明

    迅速

    func sorted<T>(by keyPath: KeyPath<Value.Wrapped, T>, ascending: Bool) -> Results<Value> where T : _HasPersistedType, T.PersistedType : SortableType

    参数

    keyPath

    排序依据的键路径。

    ascending

    排序的方向。

适用于以下位置: Value.PersistedTypeMinMaxType

适用于以下位置: Value.PersistedTypeAddableType

适用于以下位置: Value.PersistedTypeSortableType

  • sorted(ascending:) 默认实现

    默认实现

    返回包含collection中的对象的Results ,但已排序。

    对象根据其值进行排序。 例如,要对collection的Date进行从新到旧的排序,您可以调用dates.sorted(ascending: true)

    声明

    迅速

    func sorted(ascending: Bool = true) -> Results<Value>

    参数

    ascending

    排序的方向。