我对Rx世界还很陌生,我想知道自己是否做对了,还是我误解了,并且违反了最佳做法。如果是这样,如果您能指出正确的方向,我将非常高兴。

在我的iOS应用中,我需要调用网络服务来检索我的数据。我基本上可以打两个电话:


调用集合资源(/设备)
调用单个资源(/ devices / {id})


为了减少呼叫数量,我认为将数据本地存储在内存中是一个好主意,这样当我从列表视图(显示所有设备)转到详细信息视图(显示单个设备)时, ),我不必致电单一资源。

相反,仅当用户使用pull在详细信息屏幕内刷新然后将数据写回到用作列表屏幕数据源的集合时,我才进行此调用。

现在,由于该应用程序正在移动设备上运行,因此在调用Web服务时可能会出现多个错误,如果发生错误,我想向用户显示一条消息以告知问题。

我正在考虑使用Singleton类中的Subject作为UI订阅的数据源。每当需要刷新列表时,我都会通过Web服务调用创建一个新的Observable,作为副作用,它会将新数据填充到Subject中,但不会将onError或onComplete事件填充到Subject中。

我希望这段伪代码可以更好地解释我的意思:

//Pull-to-refresh function
Observable.create { observable in
  let hud = HUD("loading devices")
  self.hud = hud
  observable.next()
  return Disposable.create { hud.dismiss() }
}
.flatMap {
  return DeviceService.getList() //The web service
}
.flatMap { devices in
  DeviceSingleton.devicesSubject.next(devices) //The singleton
  return Observable.just()
}
.subscribe(
  onNext: { self.hud.dismiss() }
  onError: { error in
      self.hud.dismiss()
      self.displayError(error)
  }
)
.disposed(by: disposeBag)


在详细信息屏幕中的“拉动刷新”看起来很相似,但它涉及从主题获取当前数据,然后替换更新的设备并重新发布数据,如下所示:

//Pull-to-refresh function in detail screen
let id = ...
Observable.create { observable in
  let hud = HUD("loading devices")
  self.hud = hud
  observable.next()
  return Disposable.create { hud.dismiss() }
}
.flatMap {
  return DeviceService.getDevice(id: id) //The web service
}
.flatMap { device in
  let devices = try! DeviceSingleton.devicesSubject.value()
  let updatedDevices = self.updateDevice(device, in: devices) //removing old device, adding new one, sorting, etc.
  DeviceSingleton.devicesSubject.next(devices)
  return Observable.just()
}
.subscribe(
  onNext: { self.hud.dismiss() }
  onError: { error in
      self.hud.dismiss()
      self.displayError(error)
  }
)
.disposed(by: disposeBag)


它是否正确?这有效吗?有什么更好的方法?我认为一个问题可能是,不仅当用户拉动刷新时,而且在收到远程通知时,都可能会重新加载单个设备。

希望您能告诉我我是否正确使用Rx或在这里做错了什么。

最佳答案

看看.materialize()和.switchLatest()运算符,它们在这种情况下会派上用场。

我个人更喜欢通过使用此小型库来保持最新状态-https://github.com/maxvol/RaspSwift

关于ios - RxSwift最佳实践:我应该为内部数据源使用“主题”吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47153028/

10-12 16:16
查看更多