地图

public final class Map<Key, Value> : RLMSwiftCollectionBase where Key : _MapKey, Value : RealmCollectionValue
extension Map: ObservableObject, RealmSubscribable
extension Map: Sequence
extension Map: RealmKeyedCollection

Map 是一个键值存储container,用于存储支持的 Realm 类型。

Map 是一种泛型类型,可对其存储的类型进行参数化。 它可以是 对象 子类,也可以是以下类型之一:Bool、Int、Int8、Int16、Int32、Int64、Float、Double、String、Data、Date、Decimal128 和 ObjectId(及其可选版本)

注意

Object之外,上述类型的可选版本仅在非同步 Realm 中受支持。

Map 仅支持将字符串作为键。

与 Swift 的原生collection不同, Map是一种引用类型,只有当托管它们的 Realm 以只读方式打开时,它们才是不可变的。

可以使用与Results<Value>相同的谓词对 Map 进行过滤和排序。

Object子类上定义的Map类型的属性必须声明为let ,并且不能为dynamic

属性

初始化器

  • 创建一个Map ,用于保存类型为Value的 Realm 模型对象。

    声明

    迅速

    public override init()

数数

变更

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

    注意

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

    警告

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

    声明

    迅速

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

    参数

    value

    值的键路径谓词。

    forKey

    排序的方向。

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

    警告

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

    声明

    迅速

    public func removeObject(for key: Key)
  • 从地图中删除所有对象。 对象不会从管理它们的 Realm 中删除。

    警告

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

    声明

    迅速

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

    注意

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

    注意

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

    警告

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

    声明

    迅速

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

    参数

    key

    密钥。

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

    声明

    迅速

    @objc
    public func object(forKey key: AnyObject) -> AnyObject?

    参数

    key

    所需值的属性的键。

KVC

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

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

    声明

    迅速

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

    参数

    key

    所需值的属性的键。

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

    声明

    迅速

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

    参数

    keyPath

    所需值的属性的键。

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

    警告

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

    声明

    迅速

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

    参数

    value

    对象值。

    key

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

过滤

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

    注意

    这将返回映射中的值,而不是键值对。

    声明

    迅速

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

    参数

    predicate

    用于筛选值的谓词。

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

    声明

    迅速

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

    参数

    where

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

排序

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

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

    声明

    迅速

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

    参数

    ascending

    排序的方向。

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

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

    警告

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

    声明

    迅速

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

    参数

    keyPath

    排序依据的键路径。

    ascending

    排序的方向。

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

    警告

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

    声明

    迅速

    public func sorted<S: Sequence>(by sortDescriptors: S) -> Results<Value>
        where S.Iterator.Element == SortDescriptor

聚合操作

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

    警告

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

    声明

    迅速

    public func min<T>(ofProperty property: String) -> T? where T : MinMaxType

    参数

    property

    所需最小值的属性名称。

  • 返回collection中对象的属性的最大值,如果地图为空,则返回nil

    警告

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

    声明

    迅速

    public func max<T>(ofProperty property: String) -> T? where T : MinMaxType

    参数

    property

    所需最小值的属性名称。

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

    警告

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

    声明

    迅速

    public func sum<T>(ofProperty property: String) -> T where T : AddableType

    参数

    property

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

  • 返回collection中对象的属性的平均值,如果地图为空,则返回nil

    警告

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

    声明

    迅速

    public func average<T>(ofProperty property: String) -> T? where T : AddableType

    参数

    property

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

通知

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

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

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

    在调用区块时,映射将被完全评估并保持最新,只要您不在同一线程上执行写事务或显式调用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
    

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

    警告

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

    声明

    迅速

    public func observe(on queue: DispatchQueue?,
                        _ block: @escaping (RealmMapChange<Map>) -> Void)
    -> NotificationToken

    参数

    queue

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

    block

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

    返回值

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

冻结对象

  • 指示Map是否被冻结。

    冻结的Map是不可变的,可以从任何线程访问。 冻结的Map是通过在托管的实时Map上调用-freeze来创建的。 非托管Map永远不会被冻结。

    声明

    迅速

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

    冻结副本是不可变的Map ,其中包含与此Map当前包含的数据相同的数据,但在写入包含的 Realm 时不会更新。 与活动的Map不同,冻结的Map可以从任何线程访问。

    警告

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

    警告

    此方法只能在托管Map上调用。

    警告

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

    声明

    迅速

    public func freeze() -> Map
  • 返回此冻结Map的活动版本。

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

    声明

    迅速

    public func thaw() -> Map?
  • 返回 Map 中包含的对象的人类可读描述。

    声明

    迅速

    @objc
    public override var description: String { get }

地图

  • 每次collection更改时发出 Void 的发布者。

    尽管有这个名称,但它实际上是在collection发生更改发出的。

    声明

    迅速

    public var objectWillChange: RealmPublishers.WillChange<Map> { get }

序列支持

适用于以下位置: ValueMinMaxType

  • 返回地图中的最小值,如果地图为空,则返回nil

    声明

    迅速

    public func min() -> Value?
  • 返回地图中的最大值,如果地图为空,则返回nil

    声明

    迅速

    public func max() -> Value?

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

  • 返回地图的最小值,如果地图为空,则返回nil

    声明

    迅速

    public func min() -> Value.Wrapped?
  • 返回地图的最大值,如果地图为空,则返回nil

    声明

    迅速

    public func max() -> Value.Wrapped?

适用于以下位置: ValueAddableType

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