[英]How to store CLLocationCoordinate2D?
我正在尝试构建一个应用程序来构建和保存类似于map run的路由。 我正在使用Breadcrumb示例代码,特别是来自Apple的CrumbPath
和CrumbPathView
作为我的路线的基础。 两个问题:
如果我尝试访问MKMapPoint *points
对象, CrumbPath
所示:
[_route lockForReading]; NSLog(@"%@", _route.points); NSLog(@"%d", _route.pointCount); [_route unlockForReading];
我的应用程序崩溃,说:
Thread 1: EXC_BAD_ACCESS (code: 1, address: 0x9450342d)
我很难理解,因为在CrumbPath.m
文件中,apple的人通过显式获取写锁定然后解锁它来写入“数组”,但是如果我获取了读锁并尝试从中读取它,它崩溃了。
我尝试访问这些points
的原因是为了获取MKMapPoints
,将它们转换为CLLocationCoordinate2D
对象,然后保存它们以便我可以根据用户的请求重绘polyline
。 由于我无法访问这些points
,因此我尝试从我的locationManager
保存CLLocationCoordinate2D
对象,我将其发送到数组中的_route
传到我的Parse后端,但我总是收到错误说:
Sending 'CLLocationCoordinate2D' to parameter of incompatible type 'id'
这并没有使这更容易。 有没有人知道为什么我会收到这些错误?
位置经理代表
-(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];
}
}
停止录制逻辑
//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);
}
}];
}
关于你的第一个问题,崩溃是因为:
NSLog(@"%@", _route.pointCount);
它应该是:
NSLog(@"%d", _route.pointCount);
正如我的评论中所提到的, %d
应该用于计数, %@
会导致崩溃。
关于第二个问题,您不能将ac结构添加到NSArray
。 在将其添加到数组之前,应将其包装在NSValue
。 CLLocationCoordinate2D
是一个c-struct。 请查看此处的文档。
改变这个:
[_routePoints addObject:_userLocation];
至:
NSValue *aValue = [NSValue valueWithMKCoordinate:_userLocation];
[_routePoints addObject:aValue];
要从NSValue
获取坐标,您可以使用,
[aValue MKCoordinateValue];
如您的错误消息中所述,您试图将CLLocationCoordinate2D
添加到需要对象的数组中。
无论你使用什么api与parse交谈,都期望一个id是指向任何对象的指针。 如果我没有弄错的话,cllocationcoordinate2d是两个双精度的c结构而不是对象。 您应该创建一个小包装器对象来保存这两个双精度并将它们转换为CLLocationCoordinate2d项目。
1:
行: NSLog(@"%@", _route.points)
; 是错的
_route.points不是String,而您使用的是NSStrig格式符号“%@”。
进一步:
由于CLLocationCoordinate2D是C-Sruct而不是Objective-C对象,因此您可能想要创建自己的GeoPoint类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.