locationManager didUpdateLocations wird zweimal auf dem Gerät und nur einmal im Simulator ausgelöst

8

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?

    
sdouble 03.11.2015, 05:33
quelle

8 Antworten

11

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:

  1. Erstellen Sie eine globale bool say didFindLocation .
  2. Setzen Sie didFindLocation auf false , wenn Sie startUpdatingLocation aufrufen.
  3. Inside-Delegat ruft didUpdateLocations: zurück, wenn didFindLocation war false , set didFindLocation auf true und dann stopUpdatingLocation .

Hoffe, das hilft.

    
Abhinav 03.11.2015, 05:47
quelle
7

Der beste Weg ist wie folgt:

%Vor%     
Andrey M. 06.10.2016 09:07
quelle
5

Beste Lösung für iOS 10.0 +

%Vor%

Vergessen Sie aber nicht, den Delegierten erneut einzustellen.

    
Zumry Mohamed 21.12.2016 07:27
quelle
0

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.

    
kalpesh 15.06.2016 11:34
quelle
0

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.

    
Whirlwind 30.12.2016 10:20
quelle
0

@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.

    
SevenJustin 01.04.2017 07:47
quelle
0

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%     
Devendra Singh 19.05.2017 11:33
quelle
0

Nachdem Sie die gewünschte Breite und Länge erhalten haben, rufen Sie stopUpdatingLocation() auf und setzen Sie den Delegaten auf nil .

In Swift 3:

%Vor%

In Objective-C:

%Vor%

Hier ist locationManager das Objekt von CLLocationManager .

    
iOSAnup 21.04.2017 07:19
quelle

Tags und Links