ViewModel 中的链可观察对象用于获取但保留为独立属性

Posted

技术标签:

【中文标题】ViewModel 中的链可观察对象用于获取但保留为独立属性【英文标题】:Chain observables in ViewModel for fetch but leave as independent properties 【发布时间】:2017-10-07 14:51:28 【问题描述】:

我的MapViewController 有一个MapViewModel

我有一个 MapObjectService 和一个函数 fetchMapObjects(currentLocation: CLLocation),它返回一个 Observable<MapObjects>

在我的 MapViewModel 中:

var currentLocation: Observable<CLLocation?>
var mapObjects: Observable<MapObjects>

我可以像这样初始化当前位置:

currentLocation = locationManager.rx.didUpdateLocations.map(  locations in
        return locations.filter()  loc in
            return loc.horizontalAccuracy < 20
            .first
    )

如何有效地初始化这两个属性,以便 fetchMapObjects() 使用 currentLocation 来设置 mapObjects 属性?

我的计划是将这些属性绑定到 MapViewController 中的 mapView 以将地图对象显示为图钉和当前位置。

谢谢!

【问题讨论】:

【参考方案1】:

您可以将mapObjects 定义为currentLocation 流的延续

类似这样的:

currentLocation = locationManager.rx.didUpdateLocations.map  locations in
    return locations.first(where:  location -> Bool in
        return location.horizontalAccuracy < 20
    )


mapObjects = currentLocation.flatMapLatest  location -> Observable<MapObjects> in
    guard let location = location else 
        return Observable<String>.empty()
    
    return fetchMapObjects(currentLocation: location)

这样,每次currentLocation observable 发出一个位置,它将用于fetchMapObjects 调用。

我在这里使用flatMapLatest 而不是flatMap,以便在调用完成之前丢弃任何以前对fetchMapObjects 的调用。

您还可以在flatMapLatest 之前为currentLocation 定义过滤,以防您想忽略其中一些,例如当距离与前一个距离太近时。

现在您可以订阅您的 mapObjects observable 并处理任何发出的 MapObjects

mapObjects.subscribe(onNext:  objects in
    // handle mapObjects here
)

【讨论】:

感谢您的精彩解释。做到了! @MayNotBe 不客气!然而,为了公平起见,joern 回答了我面前的问题,并且基本上说了我所做的事情 :) 所以如果你愿意,你可以标记他的答案而不是我的答案。也许我会投赞成票? ;) 谢谢@iska!坦率地说,你的答案比我的好,至少值得再次投票。 @joern 也谢谢你!干杯:)【参考方案2】:

你可以这样做:

currentLocation = locationManager.rx.didUpdateLocations.map(  locations in
   return locations.filter()  loc in
      return loc.horizontalAccuracy < 20
   .first
)

mapObjects = currentLocation.flatMap  loc in
   return MapObjectService.fetchMapObjects(currentLocation: loc)

【讨论】:

以上是关于ViewModel 中的链可观察对象用于获取但保留为独立属性的主要内容,如果未能解决你的问题,请参考以下文章

Angular订阅链可观察

具有可观察集合类型的 Viewmodel 的 MVVM ListView 不更新视图

在 ViewModel 中获取 RegionManager

SwiftUI 将@Published viewmodel 对象值传递给@Binding

Knockout JS:从 viewmodel 可观察数组创建 Json

Android-LiveData原理解析