将NSManagedObjects数组传递给新视图

时间:2012-10-13 18:28:30

标签: iphone core-data

我正试图弄清楚如何获取NSManagedObjects列表,然后将它们传递给另一个视图。

这是我的获取

+ (NSArray *)fetchListOfParentSectors;
{
    NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Sector"];
    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"parent_id = -1"]];

    NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init];
    [moc setPersistentStoreCoordinator: [[JobDataModel sharedDataModel] persistentStoreCoordinator]];

    NSError *error = nil;
    NSArray *results = [moc executeFetchRequest:fetchRequest error:&error];
    if (error) {
        NSLog(@"ERROR: %@ %@", [error localizedDescription], [error userInfo]);
        exit(1);
    }

    return results;
}

如果我在这里放一个循环来记录sector.name,它可以很好地工作。

现在在我的视图控制器中我有这个:

NSArray *objectArray = [FetchSectors fetchListOfParentSectors];
for (int i = 0; i < objectArray.count; i++) {
    Sector *sector = (Sector *)[objectArray objectAtIndex: i];
    NSLog(@"name = %@", sector.name);
}
NSLog(@"objects = %@", objectArray);

名称返回的日志结果(null)。我知道数组不是空的,因为返回的对象数量正确,日志显示了一堆列出的对象:

"<Sector: 0xac91020> (entity: Sector; id: 0xac8e900 <x-coredata://19C94F15-0A5B-4A40-8E68-17FE6C4950F8/Sector/p4> ; data: <fault>)"

我必须在这里看到一些简单的东西..

1 个答案:

答案 0 :(得分:3)

核心数据对象只能存在于托管对象上下文中。您可以在fetchListOfParentSectors中本地创建MOC,但(假设您使用ARC进行编译),此MOC将在函数结束时自动释放。因此,当您访问对象的属性section.name时,MOC不再存在。

我原本期望这种情况有一些运行时异常,但实际上该属性的访问器只返回nil(我已经通过一个小的测试程序验证了这一点。)

因此在fetchListOfParentSectors中使用本地MOC是没有意义的。您应该使用全局MOC,或在视图控制器中创建一个,并将其作为参数传递给您的获取函数。