使用数据管理器单例管理核心数据对象

时间:2012-08-31 00:12:08

标签: ios objective-c core-data memory-management singleton

我在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,核心数据对象需要根据它进行更新。

1 个答案:

答案 0 :(得分:2)

当您将self.items = _items放入setItems:方法时,会导致无限递归。 self.items 完全与调用setItems相同 - 它们调用相同的方法。您需要做的是设置实例变量的值 - 大概是items。因此,setItems:的第一行应为items = _items。这本身也是令人困惑的,因为惯例是在变量之前用_表示实例变量。