CombineRealm
这个库是围绕RealmSwift的轻量级封装(Realm 文档),受RxSwift社区RxRealm库的启发。
用法
目录
观察对象集合
CombineRealm可以用来从类型为Results
、List
、LinkingObjects
或AnyRealmCollection
的对象创建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
许可
CombineReachability是在MIT许可下提供的。更多信息请参阅LICENSE文件。