ios mkmapview cllocation parse.com

ios - Cómo almacenar CLLocationCoordinate2D?



mkmapview parse.com (3)

1:

Línea: NSLog(@"%@", _route.points) ; Está Mal

_route.points no es una Cadena, y está utilizando el símbolo de formato NSStrig "% @".

Promover:

Como CLLocationCoordinate2D es un objeto C-Sruct y no un Objective-C, probablemente quiera crear una clase GeoPoint propia.

Intento crear una aplicación que construya y guarde rutas similares a las de mi ejecución. Estoy utilizando el código de muestra Breadcrumb , específicamente el CrumbPath y CrumbPathView como la base de mis rutas, desde Apple. Dos preguntas:

  1. Si intento acceder al objeto MKMapPoint *points de la CrumbPath manera:

    [_route lockForReading]; NSLog(@"%@", _route.points); NSLog(@"%d", _route.pointCount); [_route unlockForReading];

    mi aplicación falla, diciendo:

    Thread 1: EXC_BAD_ACCESS (code: 1, address: 0x9450342d)

    Lo cual me cuesta entender, porque dentro del archivo CrumbPath.m , la gente de apple escribe en la "matriz" adquiriendo explícitamente el bloqueo de escritura y luego desbloqueándolo, pero si adquiero el bloqueo de lectura e intento leer de eso, se bloquea.

  2. El motivo por el que intento acceder a los points es intentar obtener los MKMapPoints , convertirlos en objetos CLLocationCoordinate2D y guardarlos para poder volver a dibujar la polyline a petición del usuario. Como no puedo acceder a los points , intento guardar los objetos CLLocationCoordinate2D de mi locationManager que envío a _route en una matriz para cargarlos en mi servidor Parse , pero siempre _route un error que dice:

    Sending ''CLLocationCoordinate2D'' to parameter of incompatible type ''id''

    Lo cual no está haciendo esto más fácil. ¿Alguien tiene alguna idea de por qué estoy recibiendo estos errores?

Delegado de Gerente de Ubicación

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations { if (_userLocation.longitude != manager.location.coordinate.longitude && _userLocation.latitude != manager.location.coordinate.latitude) { _userLocation = manager.location.coordinate; } if (_isRecording) { if (!_route) { NSLog(@"lat: %f, lng: %f", _userLocation.latitude, _userLocation.longitude); _route = [[CrumbPath alloc] initWithCenterCoordinate:_userLocation]; [_mapView addOverlay:_route]; MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(_userLocation, 2000, 2000); [_mapView setRegion:region animated:YES]; }else { MKMapRect updateRect = [_route addCoordinate:_userLocation]; if (!MKMapRectIsNull(updateRect)) { MKZoomScale currentZoomScale = (CGFloat)(_mapView.bounds.size.width / _mapView.visibleMapRect.size.width); CGFloat lineWidth = MKRoadWidthAtZoomScale(currentZoomScale); updateRect = MKMapRectInset(updateRect, -lineWidth, -lineWidth); [_routeView setNeedsDisplayInMapRect:updateRect]; } } [_routePoints addObject:_userLocation]; [_route lockForReading]; NSLog(@"%d", _route.pointCount); NSLog(@"%@", _route.points); [_route unlockForReading]; } }

Detener la lógica de grabación

//stop recording NSLog(@"STOP"); if (_route) { NSLog(@"There is a route"); //Show route options toolbar [_route lockForReading]; NSLog(@"%@", _route); NSLog(@"%d", _route.pointCount); NSLog(@"%@", _route.points); PFObject *routeToSave = [PFObject objectWithClassName:@"Routes"]; //[routeToSave setObject:_route forKey:@"routePoints"]; [_route unlockForReading]; [routeToSave saveInBackgroundWithBlock:^(BOOL succeeded, NSError *error) { if (!error) { NSLog(@"%c", succeeded); }else { NSLog(@"%@", error); } }]; }


Cualquier aplicación que esté utilizando para hablar para analizar está esperando una identificación que sea un puntero a cualquier objeto. Una cllocationcoordinate2d es una c-struct de dos dobles y no un objeto si no me equivoco. Probablemente deberías crear un pequeño objeto contenedor para guardar esos dos dobles y convertirlos a / desde elementos CLLocationCoordinate2d.


En cuanto a su primer problema, el bloqueo fue por esto:

NSLog(@"%@", _route.pointCount);

Debería ser:

NSLog(@"%d", _route.pointCount);

Como mencioné en mis comentarios, %d debería usarse para contar y %@ provocará un bloqueo.

En cuanto a su segundo problema, no puede agregar una estructura a un NSArray . Debería envolverlo en NSValue antes de agregarlo a una matriz. CLLocationCoordinate2D es un c-struct. Verifique la documentación aquí.

Cambia esto:

[_routePoints addObject:_userLocation];

a:

NSValue *aValue = [NSValue valueWithMKCoordinate:_userLocation]; [_routePoints addObject:aValue];

Para recuperar la coordenada de NSValue , puede usar,

[aValue MKCoordinateValue];

Como se menciona en el mensaje de error, intentaba agregar CLLocationCoordinate2D a una matriz que espera un objeto.