我在 plist 中有一组项目。当我的应用程序启动时,我读入 plist 并将其作为数组保存在我的 DataManager 单例中,如下所示:
NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *itemDatapath = [path stringByAppendingPathComponent:@"ItemData.plist"];
NSDictionary *itemData = [NSDictionary dictionaryWithContentsOfFile:itemDatapath];
dataManager.items = [itemData objectForKey:@"Items"];
我还想将与此数据关联的核心数据对象存储在 DataManger 中,因此我尝试了以下操作:
-(void)setItems:(NSArray *)_items //causes EXC_BAD_ACCESS error
{
self.items = _items;
NSManagedObjectContext *context = [self managedObjectContext];
for (NSDictionary *item in self.items)
{
NSManagedObject *itemObject = [NSEntityDescription
insertNewObjectForEntityForName:@"Item"
inManagedObjectContext:context];
[itemObject setValue:[NSNumber numberWithInteger:[[item valueForKey:@"id"] intValue]] forKey:@"identifier"];
[itemObject setValue:[UIImage imageNamed:[item valueForKey:@"image"]] forKey:@"image"];
...
}
NSError *error;
if (![context save:&error]) {
NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
}
}
关键是我的应用程序中的任何地方都可以通过此方法访问对象:
-(NSArray*)fetchItems
{
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Item" inManagedObjectContext:managedObjectContext];
NSError *error2;
NSFetchRequest *itemFetchRequest = [[NSFetchRequest alloc] init];
[itemFetchRequest setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"order"
ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[itemFetchRequest setSortDescriptors:sortDescriptors];
NSArray *fetchedItems = [managedObjectContext executeFetchRequest:itemFetchRequest error:&error2];
return fetchedItems;
}
问题是上面提到的 EXC_BAD_ACCESS 错误。我也想知道是否有更好的方法来解决这个问题。我觉得在这里存储核心数据对象并不是最佳实践。但是,即使我在需要时在其他视图控制器中获取数据,如果核心数据对象发生更改,我如何管理更新它们?我有一个可能会改变的外部 plist,核心数据对象需要根据它进行更新。