2010-07-24 51 views
1

我有一个简单的XCode CoreData启用的iPhone/iPad导航应用程序。在这里,我修改了它最初定义的数据,以便在表格视图中用关联的图像表示一些类别。例如通过修改事件类别的其他地方,改变.xcdatamodel文件,并在RootController.m改变这一呼吁:CoreData:从XML加载到初始数据集中

- (void)configureCell:(DeliciousCategoryCell *)cell atIndexPath:(NSIndexPath *)indexPath { 

    NSManagedObject *managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
    cell.categoryLabel.text = [[managedObject valueForKey:@"name"] description]; 
    NSString *filePath = [[NSBundle mainBundle] pathForResource:cell.categoryLabel.text ofType:@"tiff"]; 
cell.categoryImage.image = [[UIImage alloc] initWithContentsOfFile:filePath]; 
} 

如果我通过把代码预加载从XML文件中的数据:

-(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

数据正常加载,但应用程序随后随EXC_BAD_ACCESS一起崩溃。如果我将这些代码从应用程序加载出来,我的数据就会出现,并且我的类别可以与关联的本地图像一起显示。我试着在别处移动有问题的代码,如:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 

和检查,以确保数据为空但它仍然崩溃尚未加载数据。我似乎无法通过调试器追踪EXC_BAD_ACCESS的原因,因为堆栈跟踪没有有用的信息。我想知道的是对以下内容的回答,因为我在苹果文档中找不到它:

1)当这种基于核心数据的应用程序首次启动时,应该在初始数据集中加载的调用去哪儿?我会理想地通过网络做到这一点,但我目前只是打开一个本地XML文件进行测试。

2)核心数据加载完成后,我想让用户通过合并来更新核心数据信息。这些代码应该放在哪里?

我没有问题的逻辑只是必要的代码afaict的位置。如果有人愿意提供我在做什么的清单,我会提供,但它相当冗长。所实现的代码直接来自两个苹果教程。后者详细说明如何在数据库中不加载提取/选择的情况下加载数据,但是所述教程没有提及任何关于的地方,其中它应该驻留。

+0

您可以提供指向您复制的代码的链接。这会让阅读更容易。 – TechZen 2010-07-24 13:12:25

+0

如果您还没有,可以考虑查看TopSongs示例项目,该示例项目演示如何使用NSOperation的子类在另一个线程上导入xml。在他们的示例中,此导入器是在-applicationDidFinishLaunching中创建的: 尽管这并不完全符合您希望执行的操作,但您可以轻松修改它以仅启动导入一次。 – 2010-07-24 13:12:31

+0

谢谢Darryl。我还没有看到这个例子,尽管最近发现了一个让我在一个应用程序中查看了tabview +导航视图+模态对话的优秀视图。我3周前需要的东西! http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/CoreData/: 链接到有问题的代码创建一个简单的项目,滴答核心数据复选框+这里找到两个文章/cdImporting.html#// apple_ref/doc/uid/TP40003174-SW1 http://www.techotopia.com/index.php/Working_with_iPhone_Databases_using_Core_Data 和几页自定义单元格视图。 – Diziet 2010-07-26 11:56:55

回答

0

当您看到EXC_BAD_ACCESS时,您已经过度释放了一个对象。 Here is some troubleshooting advice

+0

感谢您的建议,我最终解决了这个问题,借口个人链接,但我似乎无法找到我在官方的mac论坛上发布的帖子: http://www.thelostsouls.org.uk/2010/ 07/how-to-populate-coredata-at-runtime-from-a-remote-source/ – Diziet 2010-07-26 11:44:59

2

我认为你应该重视代码的位置问题。 Objective-C,核心数据和一般的Apple API都是非常封装和模块化的。您几乎可以在任何地方插入所需的功能并几乎在任何时间激活它。唯一关键的地点/时间是与应用程序启动和停止相关的应用程序委托方法。其他一切都很灵活。在你的情况下,你只需要在使用它之前加载数据,并且你只需要在数据发生变化之后合并数据。时间和地点的可能配置在功能上是无限的。不同的应用程序可以在不同的地点和时间完成这一切

你应该看看EXC_BAD_ACCESS更平淡的原因。在正常情况下,调试器会显示出发生崩溃的行。如果它什么也没有显示,那么调试器本身很可能会崩溃。更有可能的是,你只是错过了崩溃行的显示,因为触发它的代码中的行从堆栈跟踪的屏幕滚动出来。 (很多初学者犯了这个错误。)

+0

关于调试器(我知道的可视化的gdb类型,gdb的一个显示zip),它只显示2这些代码非常深入苹果库。 我觉得你绝对正确的关注我,而不是看看更普遍的错误,这要归功于纯语言的观点。我必须承认,我仍然发现自己把控制器的功能放入控制器功能来检查它们的加载顺序。 :) 正如在下面的另一个评论中提到的,我解决了这个问题,尽管是一种骇人的方式。 – Diziet 2010-07-26 11:47:53