iphone - 插入新对象系统负载的核心数据

时间:2011-02-16 17:04:21

标签: iphone objective-c core-data

这是核心数据中我不确定的事情。

假设我有一个这样的循环:

for (int i=0; i<count; i++) {

  myManagedClass *myData = [NSEntityDescription insertNewObjectForEntityForName:@"myEntity"
 inManagedObjectContext:context];

  // adjust myData properties, something like
  // myData.name = [name objectAtIndex:i];
  // myData.address = [address objectAtIndex:i];
  // etc
}

显然,除非我提交更改,否则此循环不会更改数据库上的任何内容。由于我认为Core Data是智能的,我想我必须把这个

NSError *error = nil;
if (![contexto save:&error]) {
    // Handle the error.
}
在循环之外,对吗?我的意思是,我在循环中创建的所有对象都被添加到上下文中,一旦循环完成,我提交更改,将它们存储在数据库中吗?

另一个问题:

  1. 此循环将代表应用程序在数据库访问(=磁盘访问)方面的任何负载。我想不,但我更愿意听取你的意见。
  2. 这个背景有什么样的限制?在崩溃或耗尽内存之前可以添加多少个对象?这里的最佳做法是什么?
  3. 提前谢谢。

1 个答案:

答案 0 :(得分:1)

主要问题:对。

问题1:否。

问题2:这取决于托管对象的大小。除了可用于应用程序的内存大小之外,上下文本身对象图的大小没有限制。

第一个好的做法是利用对象图中的错误。例如,如果需要托管对象的属性(在故障中)与上下文中已有的对象相关,则仅获取属性,而不是整个托管对象。如果您需要与对象相关的对象(在故障中)的属性(也在故障中)与上下文中的对象相关,请使用KVC仅获取属性,使两个相关对象出现故障。

第二个好的做法是在适当的时候向上下文发送refreshObject:managedObject mergeChanges:NO个消息。通过将参数mergeChanged设置为NO,此消息将简单地使对象出错并释放它使用的内存。在极端情况下,您可以发送reset消息来判断上下文中的所有对象。

另外,如果您不使用该功能,请将上下文的撤消管理器设置为nil。最后,考虑在紧密,繁重的循环中创建/获取大量托管对象时使用自定义自动释放池。例如,

NSAutoreleasePool *localPool = [[NSAutoreleasePool alloc] init];
for (int i=0; i<count; i++) {

    myManagedClass *myData = [NSEntityDescription 
            insertNewObjectForEntityForName:@"myEntity"
                     inManagedObjectContext:context];

    // adjust myData properties, something like
    // myData.name = [name objectAtIndex:i];
    // myData.address = [address objectAtIndex:i];
    // etc
}
[localPool release];

这取决于你在循环中做了什么,是否有自动释放池是有帮助的/相关的。

相关问题