Я работаю над реализацией Fluxlike с помощью SwiftUI.
Я хочу отслеживать местоположение пользователя и всякий раз, когда появляется новое обновление местоположения. Поэтому я использую промежуточное программное обеспечение. Промежуточное ПО ведения журнала и аутентификации Firebase работает, но отслеживание местоположения не работает. Поскольку newLocation равно nil, однако, если я помещаю замыкание location.newLocation {} в инициализацию MiddlewareProvider, он публикует изменения местоположения. Почему это ноль в промежуточном программном обеспечении?
Я включил firebase и промежуточное ПО для ведения журналов, чтобы показать работающее промежуточное ПО:
class VMiddlewareProvider: MiddlewareProvider {
private var location: TrackLocation
init() {
self.location = TrackLocation()
}
func provideMiddleware() -> [Middleware<FluxState>] {
return [
loggingMiddleware(),
locationTrackingMiddleware(),
firebaseMiddleware()
]
}
private func loggingMiddleware() -> Middleware<FluxState> {
let loggingMiddleware: Middleware<AppState> = { dispatch, getState in
return { next in
return { action in
#if DEBUG
let name = __dispatch_queue_get_label(nil)
let queueName = String(cString: name, encoding: .utf8)
print("#Action: \(String(reflecting: type(of: action))) on queue: \(queueName ?? "??")")
#endif
return next(action)
}
}
}
return loggingMiddleware
}
private func locationTrackingMiddleware() -> Middleware<FluxState> {
let middleware: Middleware<AppState> = { dispatch, getState in
return { next in
return { action in
switch action as? LocationAction {
case .trackLocation:
self.location.newLocation = { result in
/// never gets called because newLocation is nil
print(result)
}
return next(action)
default:
return next(action)
}
return next(action)
}
}
}
return middleware
}
private func firebaseMiddleware() -> Middleware<FluxState> {
let firebaseMiddleware: Middleware<AppState> = { dispatch, getState in
return { next in
return { action in
switch action {
case let action as AccountActions.Authenticate:
let handle = Auth.auth().addStateDidChangeListener { (auth, user) in
if let user = user {
return next(AccountActions.AuthentificationAction(isLoggedIn: true, userUID: user.uid))
} else {
return next(AccountActions.AuthentificationAction(isLoggedIn: false, userUID: nil))
}
}
default:
return next(action)
}
}
}
}
return firebaseMiddleware
}
}
Класс TrackLocation выглядит следующим образом:
class TrackLocation: NSObject {
let locationManager = CLLocationManager()
var newLocation: ((CLLocation)->())?
override init() {
super.init()
askForPermission()
locationManager.delegate = self
locationManager.startUpdatingLocation()
locationManager.startMonitoringSignificantLocationChanges()
locationManager.startMonitoringVisits()
}
func checkAuthorisation() {
askForPermission()
}
func askForPermission() {
locationManager.requestWhenInUseAuthorization()
}
}
extension TrackLocation: CLLocationManagerDelegate {
func locationManager(_ manager: CLLocationManager, didVisit visit: CLVisit) {
if let location = manager.location {
newLocation?(location)
}
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
newLocation?(locations.last!)
}
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
print(status)
}
}
1 ответ
Возможны две ошибки: 1. эта функция на самом деле не вызывает self.location.newLocation
. пожалуйста, будьте осторожны и отлаживайте его.
private func locationTrackingMiddleware() -> Middleware<FluxState> {
let middleware: Middleware<AppState> = { dispatch, getState in
return { next in
return { action in
switch action as? LocationAction {
case .trackLocation:
//// this code isn't called! please, check
self.location.newLocation = { result in
/// never gets called because newLocation is nil
print(result)
}
return next(action)
default:
return next(action)
}
return next(action)
}
}
}
return middleware
}
- Где-то в вашем коде вы стираете эту переменную:
self.location.newLocation = nil
Кстати, вы где-то можете удалить переменную location
Похожие вопросы
Новые вопросы
swift
Swift — это язык программирования общего назначения, разработанный Apple Inc., впервые выпущенный в 2014 году для своих платформ и Linux. Swift имеет открытый исходный код. Используйте тег только для вопросов о языковых функциях или необходимости кода в Swift. Используйте теги [ios], [ipados], [macos], [watch-os], [tvos], [swiftui], [cocoa-touch] и [cocoa] для (не зависящих от языка) вопросов о платформах или рамки.