【发布时间】:2012-10-29 20:02:15
【问题描述】:
我对 Objective-C 和 iOS 比较陌生,所以我在使用 NSManagedObject 子类作为 MKAnnotation 时遇到了问题。我执行获取请求以获取所有“地点”(NSManagedObject 子类和MKAnnotation),因此我可以填充地图。
在MapController 上的viewDidLoad 上获取它们很好:
- (void)viewDidLoad
{
[super viewDidLoad];
DatabaseHelper *db = [DatabaseHelper newDatabaseHelper]; // does all the fetch requests ahead...
NSArray *places = [[db getPlacesForDeck:@"PlacesDeck"] allObjects];
/*
[places enumerateObjectsUsingBlock:^(Place *place, NSUInteger i, BOOL *stop) {
NSLog(@"Place Number: %d", i);
NSLog(@"Place : %@", place.name);
NSLog(@"Place latitude: %@", place.latitude); ALL FINE HERE
NSLog(@"Place longitude: %@", place.longitude);
}];
*/
self.annotations = places;
[self.mapView addAnnotations:places];
}
NSLog 报告正常,但是随着地图的绘制,注释标题和坐标默认为 null,和 (0,0)。
- (NSString *) title{
return self.name; //name is an attribute from NSManagedObject subclass.
}
- (CLLocationCoordinate2D) coordinate{
CLLocationCoordinate2D coord;
coord.latitude = [self.latitude doubleValue]; // Longitude and latitude
coord.longitude = [self.longitude doubleValue]; // also dynamic attributes.
return coord;
}
我的猜测是,当我传递 'places' 数组时,我会以某种方式取消对每个地方的引用。但是我在某处读到NSArray 强烈引用了这些对象,所以我不太确定我是如何“丢失”数据的。关于发生了什么的任何提示?还是我采取了错误的方法?
【问题讨论】:
-
骗我,解决了。似乎因为我没有保留引用的 DatabaseHelper,它具有 NSManagedObjectContext 实例,因此 NSManagedObject 没有上下文并且正在丢失。只需要创建一个引用 DatabaseHelper 的 ivar 以使其保持活动状态。
标签: objective-c core-data mapkit