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 中的链可观察对象用于获取但保留为独立属性的主要内容,如果未能解决你的问题,请参考以下文章
具有可观察集合类型的 Viewmodel 的 MVVM ListView 不更新视图
SwiftUI 将@Published viewmodel 对象值传递给@Binding