结果

@frozen
public struct Results<Element> : Equatable, RealmCollectionImpl where Element : RealmCollectionValue
extension Results: RealmSubscribable
extension Results: Encodable where Element: Encodable

Results 是 Realm 中从对象查询返回的自动更新container类型。

Results 可以使用与List<Element>相同的谓词进行查询,并且可以链式查询以进一步筛选查询结果。

Results 始终反映当前线程上的 Realm 的当前状态,包括在当前线程上的写事务(write transaction)期间。唯一的例外是使用for...in枚举时,该枚举将始终枚举开始枚举时与查询匹配的对象,即使其中一些对象在枚举期间被删除或修改为被筛选器排除。

Results 首次访问时延迟求值;它们仅在请求查询结果时才运行查询。 这意味着链接多个临时Results来对数据进行排序和筛选不会执行任何不必要的中间状态处理工作。

评估结果或添加通知块后,系统会立即使结果保持最新,并尽可能在背景线程上完成保持最新的工作。

结果实例无法直接实例化。

对象检索

Equatable

Flexible Sync

  • 创建与结果的本地查询匹配的 SyncSubscription。 将订阅提交到 Realm 的本地订阅集后,该方法将根据WaitForSyncMode等待下载。

    未命名订阅

    如果调用.subscribe()时没有查询与未命名订阅匹配的名称,则不会创建其他订阅。

    如果在没有查询与命名订阅匹配的名称的情况下调用.subscribe() ,则会创建另一个未命名的订阅。

    命名订阅

    如果调用.subscribe()时使用的名称的查询与未命名的订阅匹配,则会创建另一个命名订阅。

    现有名称和查询

    如果调用.subscribe()时使用的名称已在不同查询中使用,则旧订阅将使用新查询进行更新。

    如果使用相同查询已在使用的名称调用.subscribe() ,则不会创建新的订阅。

    注意

    使用WaitForSyncMode.always.onCreation (首次创建订阅时)时,此方法将等待所有数据下载完毕,然后再返回。 如果未设置超时,则需要互联网连接。

    注意

    此方法会打开一个用于创建或更新订阅的更新事务。 建议不要循环使用此方法来创建多个订阅。 这可能会打开多个不必要的更新事务,从而造成性能瓶颈。 要一次创建多个订阅,请使用SyncSubscription.update

    警告

    仅主线程和 actor 隔离的 Realm 支持此函数。

    警告

    此 API 目前处于Preview状态,将来可能会发生变化。

    声明

    Swift

    @available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
    @_unsafeInheritExecutor
    public func subscribe(name: String? = nil, waitForSync: WaitForSyncMode = .onCreation, timeout: TimeInterval? = nil) async throws -> Results<Element>

    参数

    name

    应用于订阅的名称

    waitForSync

    WaitForSyncMode 确定订阅的下载行为。 默认为.onCreation

    timeout

    可选的客户端超时。 在此时间过后,客户端将取消对订阅下载的等待。 达到此超时并不意味着服务器出现错误。

    返回值

    返回 self

  • 删除与结果的本地筛选器匹配的 SyncSubscription。

    该方法在将订阅删除提交到 Realm 的本地订阅集后返回。 调用此方法不会等待从 Realm 中删除对象。

    要删除命名订阅,结果必须先前已创建该订阅。 例如:

    let results1 = try await realm.objects(Dog.self).where { $0.age > 1 }.subscribe(name: "adults")
    let results2 = try await realm.objects(Dog.self).where { $0.age > 1 }.subscribe(name: "overOne")
    let results3 = try await realm.objects(Dog.self).where { $0.age > 1 }.subscribe()
    // This will unsubscribe from the subscription named "overOne". The "adults" and unnamed
    // subscription still remain.
    results2.unsubscribe()
    

    注意

    此方法打开一个删除订阅的更新事务。 建议不要使用此方法批处理服务器的多个订阅。要一次取消多个订阅,请使用SyncSubscription.update

    警告

    对结果调用取消订阅不会从Results中删除本地筛选器。 调用取消订阅后,结果可能仍包含对象,因为 Realm 的订阅集中可能存在其他订阅。

    警告

    此 API 目前处于Preview状态,将来可能会发生变化。

    声明

    Swift

    public func unsubscribe()

结果

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

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

    声明

    Swift

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