私はのマネージャーを持っていて、すべてCLLocationManager
を処理する必要があります。これは、RxSwift(およびその拡張機能とDelegateProxies)を通じて観測可能なプロパティを提供することによって実現します。 LocationRepository
は次のようになります。RxSwiftドライバーを初めて2回呼び出す
class LocationRepository {
static let sharedInstance = LocationRepository()
var locationManager: CLLocationManager = CLLocationManager()
private (set) var supportsRequiredLocationServices: Driver<Bool>
private (set) var location: Driver<CLLocationCoordinate2D>
private (set) var authorized: Driver<Bool>
private init() {
locationManager.distanceFilter = kCLDistanceFilterNone
locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
supportsRequiredLocationServices = Observable.deferred {
let support = CLLocationManager.locationServicesEnabled() && CLLocationManager.significantLocationChangeMonitoringAvailable() && CLLocationManager.isMonitoringAvailable(for:CLCircularRegion.self)
return Observable.just(support)
}
.asDriver(onErrorJustReturn: false)
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
}
}
location = locationManager.rx.didUpdateLocations.asDriver(onErrorJustReturn: []).flatMap {
return $0.last.map(Driver.just) ?? Driver.empty()
}
.map { $0.coordinate }
}
func requestLocationPermission() {
locationManager.requestAlwaysAuthorization()
}
}
プレゼンターはリポジトリのプロパティの変更をリッスンします。それは作業を行い
class LocatorPresenter: LocatorPresenterProtocol {
weak var view: LocatorViewProtocol?
var repository: LocationRepository?
let disposeBag = DisposeBag()
func handleLocationAccessPermission() {
guard repository != nil, view != nil else {
return
}
repository?.authorized.drive(onNext: {[weak self] (authorized) in
if !authorized {
print("not authorized")
if let sourceView = self?.view! as? UIViewController, let authorizationView = R.storyboard.locator.locationAccessRequestView() {
sourceView.navigationController?.present(authorizationView, animated: true)
}
} else {
print("authorized")
}
}).addDisposableTo(disposeBag)
}
}
が、私は認証ステータスを取得しようと初めて二回呼び出すDriver
を取得していますので、アクセス要求ビューは二回提示します:LocatorPresenter
はこのようになります。私はここで何が欠けていますか?
よろしくお願いいたします。
ありがとう、それでした。 Observableに初めて加入するたびに、私は現在のステータスを2回与えていました。取外し開始しました。 – edulpn
これはうまくいきますが、 '.distinctUntilChanged()' ater mapをブール値にすることができます。ブール値は、状態が異なる場合にのみ呼び出され、呼び出しを複製しません。 –