Frage

Ich bin mit Aufnahmeleiter in meiner Anwendung, und ich bin immer ungenau location.I'm unter Code für den Standort bekommen

locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;

und in didupdatetolocation Methode i diesen Code bin mit.

LatitudeData = [[NSString alloc] initWithFormat:@"%f",newLocation.coordinate.latitude];
    LongitudeData = [[NSString alloc] initWithFormat:@"%f",newLocation.coordinate.longitude];
    [UIApplication sharedApplication].networkActivityIndicatorVisible=NO;
    [self insertNewLocationInDataBase];

muss ich Satz distancefilter? Wie kann ich die genaue Position bekommen? Ich mag dann genaue Lage bekommen Standort in der Datenbank eingefügt werden.

War es hilfreich?

Lösung

Erste ein gutes Ergebnis von Core-Lage in einem angemessenen Zeit dauert einiges sorgfältiges finagling.

Das Problem ist, dass, wenn Sie die Aktualisierung starten, didUpdateToLocation mehrmals ausgelöst. Jedes Mal, es feuert, sollte die Lage genauer. Allerdings weiß man nicht, wie oft es ausgelöst wird, noch wissen Sie, wie schnell eine Sperre Ihren Wunsch Genauigkeit auftreten wird (wenn es überhaupt tut). Per der Dokumentation , weitere Veranstaltungen wenn der minimalen Schwellenabstand erzeugt werden (wie durch die distanceFilter Eigenschaft angegeben) überschritten wird oder ein genauerer Ortswert bestimmt wird. die distanceFilter ändern, werden Sie keine bessere Lage geben (es sei denn natürlich, du bist in präzise interessiert Bewegungen ).

Es gibt einige allgemeine Einstellungen zu Hilfe, um diese einfacher zu machen, aber Sie werden wahrscheinlich wollen mit dieser in Abhängigkeit von den spezifischen Heuristik zur Geige Sie wünschen.

  • Stellen Sie einen Timer, nachdem Sie startUpdating senden Wähler anrufen (kann so einfach wie performSelector:afterDelay: sein). Legen Sie Ihre Verzögerung auf die maximale Menge an Zeit, die Sie bereit sind, für eine vernünftige Annäherung zu warten. Bei diesen Verfahren der Wähler, würde ich überprüfen, um sicherzustellen, dass der Standort für die Platzierung in der Datenbank genau genug ist, und es einfügen. Wenn dies nicht der Fall, ich den Benutzer alarmieren würde.
  • In didUpdateToLocation, entsorgen Sie unverzüglich alle Standorte, die zu alt sind. Die Locationmanager wird oft zunächst die im Cache gespeicherten Wert seiner Position zurückkehren -. Und es kann sehr alt sein
  • In didUpdateToLocation, einfach sparen sie das jüngste Ergebnis zu einer Instanzvariablen, wenn es nicht auf die gewünschte Genauigkeit.
  • In didUpdateToLocation, wenn der neue Standort genau genug ist, brechen die Wähler nach einer Verzögerung durchzuführen, und es stattdessen sofort nennen.

Das ist nur eine grobe Skizze, aber es ist ein ziemlich vielseitiges Setup, dass man leicht die Funktionalität zu haben, verlängern Sie es wünschen.

Hier ist der Grundzüge, wie diese funktionieren könnte. Dies ist ein gekoppeltes unten Ausschnitt aus einer meiner Ansicht-Controller zeigen, nur die Grundlagen der relevanten Teile:

- (void)viewWillAppear:(BOOL)animated {
    [self.locationManager startUpdatingLocation];
    [self performSelector:@selector(finishUpdating) withObject:nil afterDelay:10.0];
    [super viewWillAppear:animated];
}

- (void) locationManager:(CLLocationManager *)manager
     didUpdateToLocation:(CLLocation *)newLocation
            fromLocation:(CLLocation *)oldLocation {
    /* Refuse updates more than a minute old */
    if (abs([newLocation.timestamp timeIntervalSinceNow]) > 60.0) {
        return;
    }
    /* Save the new location to an instance variable */
    self.lastUpdatedLocation = newLocation;

    /* If it's accurate enough, cancel the timer */
    if (newLocation.horizontalAccuracy < 20.0) {
        [NSObject cancelPreviousPerformRequestsWithTarget:self 
                                                 selector:@selector(finishUpdating) 
                                                   object:nil]
        /* And fire it manually instead */
        [self finishUpdating];
    }
}

- (void) finishUpdating {
    /* Check the accuracy of self.lastUpdatedLocation, and either
     * save it or alert the user that it's not accurate enough */
    [self.locationManager stopUpdatingLocation];
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top