NSArray中的核心数据故障

时间:2012-02-08 16:36:21

标签: cocoa core-data automatic-ref-counting nsfetchrequest xmppframework

我有一个执行NSFetchRequest的方法来获取托管对象数组(特别是XMPPUserCoreDataStorageObjects)。在performUserFetch返回数组之前对象是正确的,我可以打印所有的displayNames,但是一旦我将数组返回到printUserInfo,对象就会进入故障状态,除了Core Data不会带来问题他们回来了!

- (NSArray*)performUserFetch 
{
    NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
    [context setPersistentStoreCoordinator:[xmppRosterStorage persistentStoreCoordinator]];
    [context setUndoManager:nil];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"XMPPUserCoreDataStorageObject" inManagedObjectContext:context];

    NSSortDescriptor *sd1 = [[NSSortDescriptor alloc] initWithKey:@"sectionNum" ascending:YES];
    NSSortDescriptor *sd2 = [[NSSortDescriptor alloc] initWithKey:@"displayName" ascending:YES];

    NSArray *sortDescriptors = [NSArray arrayWithObjects:sd1, sd2, nil];

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity:entity];
    [fetchRequest setSortDescriptors:sortDescriptors];
    [fetchRequest setReturnsObjectsAsFaults:NO];
    NSError *err;

    NSArray *result = [context executeFetchRequest:fetchRequest error:&err];
    return result;

}

- (void)printUserInfo 
{
    NSArray *result = [self performUserFetch];
    for(XMPPUserCoreDataStorageObject *user in result)
    {
        NSString *dn = user.displayName;
        NSLog(@"Display name = %@", dn);
    }
        NSLog(@"%@",result);
}

我每隔5秒调用一次printUserInfo,并在performUserFetch中调用结果数组,但是printUserInfo中的所有元素都被置于pot中,并且数组中的所有元素都已从内存中清除。那没关系,但是当我调用user.displayName时,故障没有解决,所以dn的值为null,用户的描述是

"<XMPPUserCoreDataStorageObject: 0x10219fd60> (entity: XMPPUserCoreDataStorageObject; id: 0x1021a3390 <x-coredata://324B9E93-BAD1-42B4-B7DB-2A62CA69BA13/XMPPUserCoreDataStorageObject/p127> ; data: <fault>)"

有人可以帮忙吗?!

(信息:10.7 SDK,每隔5秒调用printUserInfo,并在ARC下运行)

2 个答案:

答案 0 :(得分:5)

猜猜。尝试以下

是有希望的
  1. 每次都不要重新创建托管对象上下文。保留它作为你班级的财产。
  2. 也许您还应该分配/初始化数组以确保内存保持分配状态。您也可以使用房产。
  3. 另一种解决方案BTW是使用NSFetchedResultsController。在故障方面,它的设计特别可靠和高效。

答案 1 :(得分:2)

托管对象不会自动保留其上下文。当-performUserFetch返回且context超出范围时,您的托管对象上下文将被垃圾回收。没有上下文,托管对象本身就没用了。

只要您需要使用这些XMPPUserCoreDataStorageObject个实例,就可以自己保留上下文(正如Mundi所建议的那样)。