如何存储CLLocationCoordinate2D?
我正在尝试构build一个应用程序来构build和保存类似于映射我的运行的路线。 我使用的是Breadcrumb示例代码,特别是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
文件中,苹果公司的人们通过明确地获取写入锁,然后解锁它来写入“数组”,然后解锁它,但是如果我获得读取锁并尝试读取它,它崩溃。 -
我尝试访问
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]; } }
停止logging逻辑
//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
应该用于count, %@
会导致崩溃。
关于你的第二个问题,你不能添加ac结构到NSArray
。 在将它添加到数组之前,你应该把它包装在NSValue
。 CLLocationCoordinate2D
是一个c结构。 在这里检查文档。
改变这个:
[_routePoints addObject:_userLocation];
至:
NSValue *aValue = [NSValue valueWithMKCoordinate:_userLocation]; [_routePoints addObject:aValue];
要从NSValue
获取坐标,可以使用,
[aValue MKCoordinateValue];
正如您在错误信息中提到的那样,您正试图将CLLocationCoordinate2D
添加到期望对象的数组中。
无论你用什么API来parsing,都期望一个id,它是一个指向任何对象的指针。 cllocationcoordinate2d是两个双打的c结构,如果我没有弄错的话,它不是一个对象。 你可能应该创build一个小包装对象来保存这两个双打,并将它们转换为/从CLLocationCoordinate2d项目。
1:
行: NSLog(@"%@", _route.points)
; 是错的
_route.points不是string,而是使用NSStrig格式化符号“%@”。
进一步:
由于CLLocationCoordinate2D是一个C-Sruct,而不是一个Objective-C对象,所以你可能想创build一个自己的GeoPoint类。