RxSwift样例四 GeolocationExample

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就可以顺利开发。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值