1

我有一个MapViewModel适合我的MapViewController.

我有一个返回一个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属性?

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

谢谢!

4

2 回答 2

2

您可以定义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可观察对象发出一个位置时,它将用于fetchMapObjects调用。

如果在调用完成之前发出了新位置,我在flatMapLatest这里使用而不是flatMap丢弃任何以前的调用。fetchMapObjects

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

现在你可以订阅你的mapObjectsobservable 并处理任何MapObjects发出的。

mapObjects.subscribe(onNext: { objects in
    // handle mapObjects here
})
于 2017-10-07T16:48:29.280 回答
0

你可以这样做:

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)
}
于 2017-10-07T16:40:33.597 回答