Frage

Ich habe ein Programm mit einem Ort -Manager wie folgt:

self.locationManager = [[CLLocationManager alloc] init];
[locationManager startUpdatingLocation];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone; 
locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;

Ich brauche die Genauigkeit auf zehn Meter. Es werden jedoch ein paar Anrufe der Digupdatetolocation -Delegierten -Methode erforderlich, um den Standort nach dieser Genauigkeit zu finden. Wie würde ich den Anruf dieser Methode verzögern oder einfach angeben, wann die gewünschte Genauigkeit erreicht wird, um mit dem Programm fortzufahren?

Derzeit versucht es mit dem ersten zurückgegebenen Standort weiter. Sogar das zweite Standort -Update ist nicht so genau wie erwartet.

Danke im Voraus!

War es hilfreich?

Lösung

Da jeder Delegierteanruf eine Genauigkeitsfigur enthält, kehren Sie einfach von der Methode zurück, bis die gewünschte Genauigkeit erreicht ist (Warnung: Das kann nie passieren).

Sie können nicht einfach zu einem zehn Meter langen Ergebnis springen - es gibt einen Grund, warum es als "gewünschte" Genauigkeit und nicht obligatorische Genauigkeit bezeichnet wird. Sie müssen ihm Zeit geben, um genauere Positionen zu berechnen.

Andere Tipps

Ich habe kürzlich dieses Problem angegangen und entdeckt, Durch geschicktes Lesen der Dokumentation Endlich läuft diese Korelation in einem separaten Thread, sodass Sie sie starten und dann Ereignisse abrufen können, während sie aktualisiert werden. Es befindet sich in der Dokumentation unter der Rubrik "Den Standort des Benutzers erhalten". Hier beginnen Sie also zu aktualisieren:

- (void)startStandardUpdates
{
    if (nil == locationManager)
        locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;
    locationManager.desiredAccuracy = kCLLocationAccuracyBest;
    locationManager.distanceFilter = none;
    [locationManager startUpdatingLocation];
}

Wenn Sie das Delegierte "Selbst" machen, sendet er Ereignisse an dieselbe Klasse, in der die Startmethode definiert ist. Dann müssen Sie nur Folgendes hinzufügen, um die Ereignisse abzurufen:

- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
    fromLocation:(CLLocation *)oldLocation
{
    if (newLocation.horizontalAccuracy < 30.0)
    {
        NSLog(@"latitude %+.6f, longitude %+.6f\n",
                newLocation.coordinate.latitude,
                newLocation.coordinate.longitude);
        [manager stopUpdatingLocation];
    }
}

Auf diese Weise wird weiterhin Ereignisse empfangen und dann den GPS -Empfänger ausschalten, um Energie zu sparen. Natürlich braucht es eine Auszeit und eine Möglichkeit, den Ort mit der besten horizontalen Genauigkeit zu speichern und zu akzeptieren, wenn es ausfällt, aber ich habe noch nicht herausgefunden, wie das geht.

Eine Strategie besteht darin, einen Timer für einen Zeitraum lang genug zu starten, um eine Lösung zu erhalten (was auch für den Benutzer akzeptabel ist)

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats

Starten Sie den Standortmanager, der Updates liefert. Wenn der Timer abläuft (oder Sie eine akzeptable Genauigkeit erhalten), stoppen Sie die Updates und verwenden diesen Ort.

Es ist wahrscheinlich das Beste, was Sie bekommen werden. Möglicherweise möchten Sie dem Benutzer die Möglichkeit geben, es erneut für einen Ort zu versuchen, wenn er noch nicht genau genug ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top