RxRealm 5.0.4

RxRealm 5.0.4

测试已测试
语言语言 SwiftSwift
许可 MIT
发布最后发布2022年1月
SPM支持 SPM

Marin TodorovCarlos GarcíaRxRealm 维护者RxSwift 社区维护。



 
依赖
Realm~> 10.21
RealmSwift~> 10.21
RxSwift~> 6.1
RxCocoa~> 6.1
 

RxRealm 5.0.4

  • RxSwift 社区

RxRealm

Carthage Compatible Version Swift Package Manager compatible License Platform

这个库是围绕 RealmSwiftRealm 文档)的一个薄包装。

目录

  1. 观察对象集合
  2. 观察单个对象
  3. 写事务
  4. 自动绑定表格和收集视图
  5. 示例应用

观察对象集合

RxRealm 可以用于从类型为 ResultsListLinkingObjectsAnyRealmCollection 的对象创建 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)

数据源将通过动画反映表格视图中的所有更改

RxRealm animated changes

如果您想了解更多关于超出动画功能的功能,请查看RxRealmDataSourcesREADME

示例应用

要运行示例项目,请克隆存储库,然后首先从示例目录运行pod install。该应用使用RxSwift、RxCocoa(使用RealmSwift、RxRealm从Realm观察结果)。

你可以查看示例应用的RxRealmTests目录,其中包含该库的单元测试。

安装

该库同时依赖于 RxSwiftRealmSwift 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 文件。