2010-09-27 6 views
8

Tengo un problema con getDistanceFrom y distanceFromLocation. getDistanceFrom está en desuso iOS 4.1 y distanceFromLocation no está disponible en 3.1.3, ¿cómo puedo solucionar este problema?getDistanceFrom Vs distanceFromLocation

¿Alguien más ha encontrado este problema?

Mi código en este momento es:

CLLocationDistance kilometers; 
     if ([currentLocation respondsToSelector: @selector(distanceFromLocation:)]) 
     { 
      kilometers = [currentLocation distanceFromLocation:previousLocation]/1000; 
     } 
     else 
     { 
      //kilometers = [currentLocation getDistanceFrom:previousLocation]/1000; 
      kilometers = [currentLocation performSelector: @selector(getDistanceFrom:) withObject: previousLocation]/1000; 
     } 

Dependiendo de la IOS que compila con Me estoy poniendo 'operandos no válidos a binario' en las líneas:

kilometers = [currentLocation distanceFromLocation:previousLocation]/1000; 
      kilometers = [currentLocation performSelector: @selector(getDistanceFrom:) withObject: previousLocation]/1000; 

Saludos, Stephen

Respuesta

14

Hay un blog post de Cédric Luthi que tiene una muy buena solución para esto.

En resumen, es necesario introducir lo siguiente en su main.m y asegúrese de #import <objc/runtime.h>:

Method getDistanceFrom = class_getInstanceMethod([CLLocation class], @selector(getDistanceFrom:)); 
class_addMethod([CLLocation class], @selector(distanceFromLocation:), method_getImplementation(getDistanceFrom), method_getTypeEncoding(getDistanceFrom)); 

continuación, puede utilizar distanceFromLocation: en cualquier sistema operativo.

+0

Excelente solución! Gracias por llamar mi atención! – Jann

+0

Devuelve vacío ... Por favor ayuda. Estoy comprobando en 3.0 Gracias de antemano – Sohail

+0

Comienza una nueva pregunta. –

11

Uso mi propio método. Es MUCHO más rápido y se puede usar en iOS 3.xy iOS 4.x.

 

- (double)distanceFrom:(CLLocationCoordinate2D)locationA to:(CLLocationCoordinate2D)locationB 

{ 
    double R = 6368500.0; // in meters 

    double lat1 = locationA.latitude*M_PI/180.0; 
    double lon1 = locationA.longitude*M_PI/180.0; 
    double lat2 = locationB.latitude*M_PI/180.0; 
    double lon2 = locationB.longitude*M_PI/180.0; 

    return acos(sin(lat1) * sin(lat2) + 
       cos(lat1) * cos(lat2) * 
       cos(lon2 - lon1)) * R; 
} 
 
+0

Esto es excelente, ¡gracias! – mpemburn

+0

¡Impresionante! -- ¡Gracias! –

+0

¿Es realmente más rápido? No noté que fuera más rápido que el método .distanceFromLocation. La única diferencia era valores de resultado bastante diferentes. – yerassyl

Cuestiones relacionadas