Como armazenar CLLocationCoordinate2D?
Eu estou tentando construir um aplicativo que cria e salva rotas semelhantes para mapear minha execução. Estou usando oBreadcrumb código de amostra, especificamente oCrumbPath
eCrumbPathView
como base de minhas rotas, da Apple. Duas questões:
Se eu tentar acessar oMKMapPoint *points
objeto doCrumbPath
igual a:
[_route lockForReading];
NSLog(@"%@", _route.points);
NSLog(@"%d", _route.pointCount);
[_route unlockForReading];
meu aplicativo trava, dizendo:
Thread 1: EXC_BAD_ACCESS (code: 1, address: 0x9450342d)
Que eu tenho dificuldade em entender, porque dentro doCrumbPath.m
arquivo, o pessoal da apple escrever para o "array" explicitamente adquirir o bloqueio de gravação e, em seguida, desbloqueá-lo, mas se eu adquirir o bloqueio de leitura e tentar ler a partir dele, ele falha.
A razão pela qual eu tento acessar opoints
está em uma tentativa de obter oMKMapPoints
, converta-os paraCLLocationCoordinate2D
objetos, e salvá-los para que eu possa redesenhar opolyline
a pedido do usuário. Como não consigo acessar opoints
, Tento salvar oCLLocationCoordinate2D
objetos do meulocationManager
que eu mando para o_route
em uma matriz para fazer o upload para o meuAnalisar backend, mas eu sempre recebo um erro dizendo:
Sending 'CLLocationCoordinate2D' to parameter of incompatible type 'id'
O que não está facilitando isso. Alguém tem alguma idéia de por que estou recebendo esses erros?
Delegado de gerente de localização
-(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];
}
}
Parar a lógica de gravação
//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);
}
}];
}