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

标签 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 错误。我也想知道是否有更好的方法来解决这个问题。我觉得在这里存储核心数据对象不是最佳做法。但是,即使我在其他 View Controller 中需要时获取数据,如果核心数据对象发生变化,我又该如何管理更新呢?我有一个可能会更改的外部 plist,核心数据对象需要基于它进行更新。

最佳答案

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

关于ios - 使用数据管理器单例管理核心数据对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12207337/

相关文章:

ios - 为什么一个代码可以工作而另一个代码不能获取 NSUserDefaults?

c++ - 通过 AUGraph 连接的 iOS 波形发生器

ios - NSPredicate 在 NSSet 中查找具有属性的对象

ios - 向 coredata 添加一个新实体——我还能使用轻量级迁移吗?

iphone - 如何从我的应用程序将图像发送到 WhatsApp?

iphone - 如何在iphone中获取通话记录?

ios - 使用脏矩形优化 OpenGL ES 2.0 2D 绘图

iOS/objective-C : BLE in Peripheral mode doesn't work

iphone - 如何解析Json对象

cocoa - 如果 NSManagedObject 子类对象是 NSViewController 的representedObject,这是一个错误吗?