GeolocationExample 是取地理位置的demo。
GeolocationViewController中的代码只有几句话,之前的例子没有出现过的只有driver。其实driver很好理解,类似Observable和bind的方法,但是没有error而且必须在主线程使用。
重点来看GeolocationService中的代码。
GeolocationService是一个单例,swift中设定单例非常简单,不可变数据放在静态区就可以了。有俩个只读属性,authorized 判断是否可以获取位置的权限,location 得到地理信息的CLLocationCoordinate2D类。都是Driver类型
- it never fails
- it delivers events on `MainScheduler.instance`
- `shareReplayLatestWhileConnected()` behavior
对driver的定义在这里。没有error情况,必须在主线程,共享订阅状态。最重要的定义就是这三点。
authorized = Observable.deferred { [weak locationManager] in
let status = CLLocationManager.authorizationStatus()
guard let locationManager = locationManager else {
return Observable.just(status)
}
return locationManager
.rx.didChangeAuthorizationStatus
.startWith(status)
}
.asDriver(onErrorJustReturn: CLAuthorizationStatus.notDetermined)
.map {
switch $0 {
case .authorizedAlways:
return true
default:
return false
}
}
deferred是创建序列的方法,每个订阅者都会创建一个新的序列。这个序列里面最终map成了如果定位打开的return true,否则false
location = locationManager.rx.didUpdateLocations
.asDriver(onErrorJustReturn: [])
.flatMap {
return $0.last.map(Driver.just) ?? Driver.empty()
}
.map { $0.coordinate }
这里我如果没记错是三目的缩写,第一个有值即为第一个,否则反之。
整个代码清晰流畅,只要记住一些API就可以顺利开发。