【发布时间】:2017-06-28 22:09:38
【问题描述】:
我开始使用 ReactiveCocoa,但我仍在为一些基本概念苦苦挣扎:
- 我的应用开始监听地理位置数据(
init在我的视图模型中) - 我的应用程序发出一个带有我当前位置的信号(调用
didFindCurrentPosition) - 我的视图控制器显示地图加载(
viewDidLoad在我的视图控制器中) - 我的视图控制器开始观察当前位置信号(还是
viewDidLoad)
我的问题是:在第 2 步完成后,如果没有在信号上发送其他事件,我的视图控制器不会得到通知。
我的视图控制器如何访问信号的最后一个值? (即如何在第 3 步获得对第 2 步发出的值的访问权?)
感谢您的帮助。
PS:ReactiveCocoa 看起来像一个很棒的库,但我对文档的状态感到困惑。恕我直言,它不是很清楚,并且缺乏一些关于如何使用它的明确指南。
代码
视图模型:
class MyViewModel: LocationManagerDelegate {
let locationManager: LocationManager
let geolocationDataProperty = MutableProperty<Geolocation?>(nil)
let geolocationData: Signal<Geolocation?, NoError>
init() {
geolocationData = geolocationDataProperty.signal
// Location Management
locationManager = LocationManager()
locationManager.delegate = self
locationManager.requestLocation()
}
// MARK: - LocationManagerDelegate
func didFindCurrentPosition(location: CLLocation) {
geolocationDataProperty.value = Geolocation(location: location)
}
}
视图控制器:
class MyViewController: UIViewController {
let viewModel = MyViewModel()
init() {
super.init(nibName: nil, bundle: nil)
}
override func viewDidLoad() {
super.viewDidLoad()
viewModel.geolocationData
.observe(on: UIScheduler())
.observeValues { geolocation in
debugPrint("GOT GEOLOCATION")
}
}
}
【问题讨论】:
-
我猜您正在使用 SignalProducer(冷信号)来获取地理位置数据。您是否使用 MutableProperty 来实现数据绑定?
-
@cristallo:我没有使用响应式概念来获取地理位置数据,只是常规的 CoreLocation 委托回调。我正在使用 MutableProperty 来存储位置,并从中获取信号。我在我的问题中添加了代码以使事情更清楚。
标签: ios swift reactive-programming reactive-cocoa reactive-cocoa-5