Gleicher Code, ich gehe davon aus, dass das Gerät den Standort aus irgendeinem Grund tatsächlich zweimal aktualisiert, obwohl ich nur startUpdatingLocation () einmal aufrufe und einige stopUpdatingLocations () in didUpdateLocations
ausfühle %Vor%In diesem Fall wird createNewDataPoint zweimal aufgerufen, wodurch zwei neue Datenpunkte erstellt werden. Es passiert nur einmal im Simulator, also gehe ich davon aus, dass es etwas mit dem eigentlichen Gerät und dem GPS zu tun hat, da der Simulator seinen Standort vortäuscht.
startUpdatingLocation () ist nur einmal in meinem Code, auf einer Schaltfläche. Im Grunde, klicken Sie auf den Button, go go manager.startUpdatingLocations (), didUpdateLocations Treffer einmal im Simulator, zweimal auf dem Gerät (identische Koordinaten) und es erstellt 2 neue Datenpunkte.
Der einzige andere Code, der etwas erwähnt, bezieht sich auf die Genauigkeit, den Filter, Autorisierungsanfragen und die zuvor erwähnte startUpdatingLocation (). Kann ich etwas dafür tun, dass ich nicht doppelt so viele Datenpunkte erstelle wie nötig?
Location Manager Delegate-Methoden können sehr häufig und jederzeit aufgerufen werden.
Sie können jedoch folgenden Algorithmus anwenden, um sich selbst zu schützen:
bool
say didFindLocation
. didFindLocation
auf false
, wenn Sie startUpdatingLocation
aufrufen. didUpdateLocations:
zurück, wenn didFindLocation
war false
, set didFindLocation
auf true
und dann stopUpdatingLocation
. Hoffe, das hilft.
Vergessen Sie aber nicht, den Delegierten erneut einzustellen.
Sie werden nicht häufig am Simulator teilnehmen. und auf dem Gerät, wenn du dich weit wegbewegst, bekommst du nur didUpdateLocations
. Bewegen Sie sich einfach in einem offenen Raum, so dass GPS Ihren Gerätestandort identifizieren kann, um die beste Genauigkeit zu erhalten.
Anstatt die Standortaktualisierung zu starten / zu beenden und delegate auf null zu setzen, gibt es eine Methode namens requestLocation Dies ist ideal, wenn Ihre Anwendung eine schnelle Lösung für den Standort des Benutzers benötigt:
Aus der Dokumentation:
%Vor%Verwenden Sie diese Methode, wenn Sie den aktuellen Standort des Benutzers haben möchten, die Standortdienste jedoch nicht ausgeführt werden müssen.
@Zumry Mohameds Lösung ist richtig
Ich versuche den Code so:
%Vor% Schließlich wird dieser Delegat nur einmal aufgerufen, ich verstehe jetzt, warum das Problem aufgetreten ist, nur weil Manager die Methode stopUpdatingLocation
aufruft, aber das System uns nicht hilft, den Delegierten ungültig zu machen, damit wir den Rückruf jedes Mal erhalten können Standort-Updates aufgrund Ihrer desiredAccuracy
und distanceFilter
-Eigenschaft-Einstellungen von CLLocationManager
, also ist die endgültige Lösung genau das, was @Zumry Mohamed sagte, wir können den Delegaten manuell auf null setzen, wenn wir stopUpdateLocation
. Ich hoffe, es wird Ihnen helfen zu verstehen, was passiert, warum dies das Problem lösen könnte.
locationManager.startUpdatingLocation () ruft den Speicherort fortlaufend und die Aufrufe der Methode didUpdateLocations mehrmals ab. Setzen Sie den Wert für den Wert locationManager.distanceFilter vor dem Aufruf von locationManager.startUpdatingLocation ().
Wie ich 200 Meter eingestellt habe (Sie können als Ihre Anforderung ändern) gut funktioniert
%Vor%Tags und Links ios swift cllocationmanager