RxSwift和控制流程 - 一个坏主意?

时间:2018-04-16 20:55:25

标签: swift realm reactive-programming rx-swift

我开发了一个结构,可以在我的应用程序中生成用于测试目的的随机数据,但只有在Realm数据库为空时才会这样做。负责CRUD操作的服务类将结果/结果返回为RxSwift Observables。 生成新数据取决于领域的内容 - 使用guard是合乎逻辑的选择,但需要向返回Int的服务添加新方法,而不是Observable,这似乎是不必要的代码重复,有些不一致。

class Service {
  let realm = try! Realm()
  ...
  // Existing reactive code
  func patients() -> Observable<Result<Patient>> {
    let results = realm.objects(Patient.self)
    return Observable.collection(from: results)
  }

  func objectCount() -> Int {
    let realm = try! Realm()
    return realm.objects(Patient.self).count
  }
}

struct DataGenerator() {
...
  func createRandomPatients() {
    let service = Service()
    guard service.objectCount() == 0 else { return }
    ...
    //go on to generate patients

我可以使用反应式服务方法复制此控制流的唯一方法是将Observable绑定到Variable

... service code as above ...
func createRandomPatients() {
   let isEmpty = Variable<Bool>(false)
   service.patients().map{ $0 == 0 }.bind(to: isEmpty)
   guard isEmpty.value else { return }
   // etc

它看起来有点像软糖,因为它可能并不是很清楚,但它避免了将代码添加到不会在生产应用程序中使用的服务类中。这是不好的做法还是个人偏好?如果有人有一个解决方案,我会接受替代解决方案...

1 个答案:

答案 0 :(得分:0)

伪造绝对应该用多态来处理。

一个好的设计是定义一个通用接口;例如,它可以是PatientsSource

protocol PatientsSource {

    func patients() -> Observable<Result<[Patient]>>

}

您可以通过定义:

来利用多态性
class PatientsService: PatientsSource... {
    //w/e
}

struct FakePatients: PatientsSource {
    //your random patients generation
}

如果您使用Service样式架构,那么您应该将ServicePatientsSource分别传递给用户(例如您的控制器),即使它们可能最终相同对象