RxRealm
这个库是围绕 RealmSwift (Realm 文档)的一个薄包装。
目录
观察对象集合
RxRealm 可以用于从类型为 Results
、List
、LinkingObjects
或 AnyRealmCollection
的对象创建 Observable
。这些类型通常用于从 Realm 移动数据库加载数据和观察对象集合。
Observable.collection(from:synchronousStart:)
在每个集合发生变化时发出一个事件
let realm = try! Realm()
let laps = realm.objects(Lap.self)
Observable.collection(from: laps)
.map {
laps in "\(laps.count) laps"
}
.subscribe(onNext: { text in
print(text)
})
上面的代码在每次向数据库添加或删除 lap 时打印出 "X laps"。如果将 synchronousStart
设置为 true
(默认值),第一个元素将同步发出 - 例如,当绑定 UI 时,可能无法接收异步通知。
Observable.array(from:synchronousStart:)
每次更改时,都会获取Realm集合的快照并将其转换为数组值(例如,如果您想在集合上使用数组方法)
let realm = try! Realm()
let laps = realm.objects(Lap.self)
Observable.array(from: laps)
.map { array in
return array.prefix(3) //slice of first 3 items
}
.subscribe(onNext: { text in
print(text)
})
Observable.changeset(from:synchronousStart:)
每当集合更改时,都会发出事件并提供了确切的删除、插入或更新的索引
let realm = try! Realm()
let laps = realm.objects(Lap.self)
Observable.changeset(from: laps)
.subscribe(onNext: { 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)
}
})
Observable.arrayWithChangeset(from:synchronousStart:)
将Observable.array(from:)
和Observable.changeset(from:)
的结果结合起来,返回一个Observable<Array<T>, RealmChangeset?>
let realm = try! Realm()
let laps = realm.objects(Lap.self))
Observable.arrayWithChangeset(from: laps)
.subscribe(onNext: { array, changes in
if let changes = changes {
// it's an update
print(array.first)
print("deleted: \(changes.deleted)")
print("inserted: \(changes.inserted)")
print("updated: \(changes.updated)")
} else {
// it's the initial data
print(array)
}
})
观察单个对象
有单独的API,使其更容易观察单个对象
Observable.from(object: ticker)
.map { ticker -> String in
return "\(ticker.ticks) ticks"
}
.bindTo(footer.rx.text)
该API使用Realm对象通知作为底层来监听更改。
默认情况下,该方法会将其初始状态作为第一个next
事件发出。您可以通过使用emitInitialValue
参数并设置为false
来禁用此行为。
最后,您可以设置哪些属性更改构成对象更改,您希望观察这些更改
Observable.from(object: ticker, properties: ["name", "id", "family"]) ...
写入事务
rx.add()
向已存在的领域引用写入对象。可以将新创建的对象添加到您已经初始化的领域
let realm = try! Realm()
let messages = [Message("hello"), Message("world")]
Observable.from(messages)
.subscribe(realm.rx.add())
请注意,这将保持您的领域,直到Observable
完成或出现错误。
Realm.rx.add()
向默认领域写入数据。您可以将此任务交给RxRealm,它可以获取任何线程上的默认领域,并向其写入对象
let messages = [Message("hello"), Message("world")]
Observable.from(messages)
.subscribe(Realm.rx.add())
Realm.rx.add(configuration:)
向自定义领域写入数据。如果您想切换线程而不用默认领域,请提供一个Realm.Configuration
。您还可以为观察者提供一个错误处理器,以便在创建领域引用或写交易时出现错误时被调用
var config = Realm.Configuration()
/* custom configuration settings */
let messages = [Message("hello"), Message("world")]
Observable.from(messages)
.observeOn( /* you can switch threads here */ )
.subscribe(Realm.rx.add(configuration: config, onError: {elements, error in
if let elements = elements {
print("Error \(error.localizedDescription) while saving objects \(String(describing: elements))")
} else {
print("Error \(error.localizedDescription) while opening realm.")
}
}))
如果您想在其他线程上手动创建一个领域,以便处理错误,您也可以这样做
let messages = [Message("hello"), Message("world")]
Observable.from(messages)
.observeOn( /* you can switch threads here */ )
.subscribe(onNext: {messages in
let realm = try! Realm()
try! realm.write {
realm.add(messages)
}
})
rx.delete()
从现有领域引用中删除对象
let realm = try! Realm()
let messages = realm.objects(Message.self)
Observable.from(messages)
.subscribe(realm.rx.delete())
请注意,这将在Observable
完成或出现错误之前保持您的领域。
Realm.rx.delete()
自动从对象的领域删除。您可以让RxRealm从第一个对象获取领域并使用它
Observable.from(someCollectionOfPersistedObjects)
.subscribe(Realm.rx.delete())
自动绑定表格和管理视图
RxRealm不依赖于UIKit/Cocoa,也不提供绑定Realm集合到UI组件的内置方法。
a) 非动画绑定
您可以使用内置的RxCocoa bindTo(_:)
方法,这将自动从Realm结果驱动您的表格视图。
Observable.from( [Realm collection] )
.bindTo(tableView.rx.items) {tv, ip, element in
let cell = tv.dequeueReusableCell(withIdentifier: "Cell")!
cell.textLabel?.text = element.text
return cell
}
.addDisposableTo(bag)
b) 使用RxRealmDataSources的动画绑定
独立的库RxRealmDataSources模仿了RxSwift的默认数据源库行为。
RxRealmDataSources
允许您将可观察的Realm对象集合直接绑定到表格或集合视图。
// create data source
let dataSource = RxTableViewRealmDataSource<Lap>(
cellIdentifier: "Cell", cellType: PersonCell.self) {cell, ip, lap in
cell.customLabel.text = "\(ip.row). \(lap.text)"
}
// RxRealm to get Observable<Results>
let realm = try! Realm()
let lapsList = realm.objects(Timer.self).first!.laps
let laps = Observable.changeset(from: lapsList)
// bind to table view
laps
.bindTo(tableView.rx.realmChanges(dataSource))
.addDisposableTo(bag)
数据源将通过动画反映表格视图中的所有更改
如果您想了解更多关于超出动画功能的功能,请查看RxRealmDataSources
的README。
示例应用
要运行示例项目,请克隆存储库,然后首先从示例目录运行pod install
。该应用使用RxSwift、RxCocoa(使用RealmSwift、RxRealm从Realm观察结果)。
你可以查看示例应用的RxRealmTests目录,其中包含该库的单元测试。
安装
该库同时依赖于 RxSwift 和 RealmSwift 1.0+。
CocoaPods
RxRealm 需要 CocoaPods 1.1.x 或更高版本。
RxRealm 可以通过 CocoaPods 获取。要安装它,只需在 Podfile 中添加以下行
pod "RxRealm"
Carthage
要使用 Carthage 将 RxRealm 集成到您的 Xcode 项目中,请在 Cartfile
中指定它
github "RxSwiftCommunity/RxRealm"
运行 carthage update
来构建框架,然后将构建的 RxRealm.framework
拖入您的 Xcode 项目。
Swift 包管理器
在您的 Package.swift
let package = Package(
name: "Example",
dependencies: [
.package(url: "https://github.com/RxSwiftCommunity/RxRealm.git", from: "1.0.1")
],
targets: [
.target(name: "Example", dependencies: ["RxRealm"])
]
)
待办事项
- 测试添加平台并添加 pod 兼容性
许可
此库属于 RxSwiftCommunity。维护者是 Marin Todorov。
RxRealm 根据 MIT 许可证提供。有关更多信息,请参阅 LICENSE 文件。