Combine-Realm 2.0.0

Combine-Realm 2.0.0

Istvan KreiszCombine 社区维护。



  • ById
  • Istvan Kreisz和Combine 社区

CombineRealm

CombineRealm Logo

Version License Platform

这个库是围绕RealmSwift的轻量级封装(Realm 文档),受RxSwift社区RxRealm库的启发。

用法

目录

  1. 观察对象集合
  2. 观察单个对象
  3. 观察Realm实例
  4. 写事务
  5. 删除事务
  6. 示例应用

观察对象集合

CombineRealm可以用来从类型为ResultsListLinkingObjectsAnyRealmCollection的对象创建Publisher。这些类型通常用于从Realm Mobile Database加载和观察对象集合。

RealmPublishers.collection(from:synchronousStart:)

每次集合改变时都会发出一个事件

let realm = try! Realm()
let colors = realm.objects(Color.self)

RealmPublishers.collection(from: colors)
    .map { colors in "colors: \(colors.count)" }
    .sink(receiveCompletion: { _ in
        print("Completed")
    }, receiveValue: { result in
        print(result)
    })

每次向数据库添加或删除 Color 实例时,都会打印出 "colors: X"。如果您将 synchronousStart 设置为 true(默认值),则第一个元素将同步发出 - 例如,当您绑定 UI 时,可能无法传递异步通知。

RealmPublishers.array(from:synchronousStart:)

每次改变时获取 Realm 集合的快照并将其转换为数组值(例如,如果您想在集合上使用数组方法)

let realm = try! Realm()
let colors = realm.objects(Color.self)

RealmPublishers.array(from: colors)
    .map { colors in colors.prefix(3) }
    .sink(receiveCompletion: { _ in
        print("Completed")
    }, receiveValue: { colors in
        print(colors)
    })

RealmPublishers.changeset(from:synchronousStart:)

每当集合发生变化时,都会发出通知,并提供已删除、已插入或已更新的确切索引及其相应的 AnyRealmCollection<T>

let realm = try! Realm()
let colors = realm.objects(Color.self)

RealmPublishers.changeset(from: colors)
    .sink(receiveCompletion: { _ in
        print("Completed")
    }, receiveValue: { results, changes in
        if let changes = changes {
            // it's an update
            print(results)
            print("deleted: \(changes.deleted)")
            print("inserted: \(changes.inserted)")
            print("updated: \(changes.updated)")
        } else {
            // it's the initial data
            print(results)
        }
    })

RealmPublishers.arrayWithChangeset(from:synchronousStart:)

每当集合发生变化时,都会提供已删除、已插入或已更新的确切索引以及相应的 Array<T>

let realm = try! Realm()
let colors = realm.objects(Color.self))

RealmPublishers.arrayWithChangeset(from: colors)
    .sink(receiveCompletion: { _ in
        print("Completed")
    }, receiveValue: { array, changes in
        if let changes = changes {
            // it's an update
            print(array)
            print("deleted: \(changes.deleted)")
            print("inserted: \(changes.inserted)")
            print("updated: \(changes.updated)")
        } else {
            // it's the initial data
            print(array)
        }
    })

监视单个对象

RealmPublishers.from(object:emitInitialValue:properties:)

每当监视对象的任何属性发生变化时都会发出通知。

默认情况下,它将发出对象的初始状态作为其第一个值。您可以通过使用 emitInitialValue 参数并将其设置为 false 来禁用此行为。

RealmPublishers.from(object: color)
    .sink(receiveCompletion: { _ in
        print("Completed")
    }) { color in
        print(color)
    }

您可以设置希望观察哪些属性变化

Observable.from(object: ticker, properties: ["red", "green", "blue"])

观察领域实例

RealmPublishers.from(realm:)

每次领域变化时都会触发:在领域内发生的任何创建、更新和删除操作。它提供了领域实例和领域变化通知。

let realm = try! Realm()

RealmPublishers.from(realm: realm)
    .sink(receiveCompletion: { _ in
        print("Completed")
    }) { realm, notification in
        print("Something happened!")
    }

写事务

addToRealm()

将对象(s)写入默认领域:Realm(configuration: .defaultConfiguration)

let realm = try! Realm()
let colors = realm.objects(Color.self))

RealmPublishers.array(from: colors)
  .addToRealm()

addToRealm(configuration:updatePolicy:onError:)

将对象(s)写入一个自定义领域。如果您想切换线程而不使用默认领域,请提供Realm.Configuration。您还可以提供错误处理器,以便在创建领域引用或写入事务引发错误时调用观察者

注意:所有 3 个参数都是可选的,请检查函数定义以获取默认值

let realm = try! Realm()
let colors = realm.objects(Color.self))

RealmPublishers.array(from: colors)
  .addToRealm(configuration: .defaultCOnfiguration, updatePolicy: .error, onError: {
      print($0)
  })

删除事务

deleteFromRealm()

从对象所属的领域删除对象

let realm = try! Realm()
let colors = realm.objects(Color.self))

RealmPublishers.array(from: colors)
  .deleteFromRealm()

deleteFromRealm(onError:)

从对象所属的领域删除对象。您还可以为观察者提供错误处理器,如果创建领域引用或写事务引发错误时将被调用

let realm = try! Realm()
let colors = realm.objects(Color.self))

RealmPublishers.array(from: colors)
  .deleteFromRealm(onError: {
      print($0)
  })

示例应用

要运行示例项目,克隆存储库,导航到示例文件夹并打开Example.xcodeproj文件。

为确保使用CombineRealm的最新版本,在Xcode中选择File/Swift Packages/Add Package Dependency...菜单中的Update to Latest Package Versions

该应用使用CombineRealm来观察Realm中的变化并进行写入。

测试

要检查该库的单元测试,请查看代码库根目录下的Tests/CombineRealmTests中的文件。要运行测试,转到存储库的根目录并执行以下命令

swift test

安装

CocoaPods

将以下行添加到您的Podfile中并运行pod install

pod 'Combine-Realm'

由于Xcode中的导入语句不能包含连字符,导入库的正确方式是

import Combine_Realm

Swift包管理器

  • 在Xcode中选择文件/Swift Packages/添加包依赖...
  • https://github.com/istvan-kreisz/CombineRealm.git粘贴到仓库URL文本字段中。

未来想法

  • 添加CI测试
  • 添加Carthage支持
  • 你的想法呢?

作者

Istvan Kreisz

[email protected]

@IKreisz

许可

CombineReachability是在MIT许可下提供的。更多信息请参阅LICENSE文件。