【问题标题】:Core Data faulting in NSArrayNSArray 中的核心数据故障
【发布时间】:2023-03-27 18:40:01
【问题描述】:

我有一个方法可以执行 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 中的所有内容都已完成,并且数组中的所有元素都已从内存中清除。这很好,但是当我调用 user.displayName 时,故障没有解决,所以 dn 的值为 null,用户的描述是

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

谁能帮忙?!

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

【问题讨论】:

  • 只是好奇,我遇到了完全相同的问题。你解决过这个问题吗?
  • 你应该选择Mundi的答案作为答案

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


【解决方案1】:

只是猜测。尝试以下方法会很有希望

  1. 不要每次都重新创建托管对象上下文。将其作为您班级的财产。
  2. 也许您还应该分配/初始化数组以确保内存保持分配状态。您也可以使用属性。

顺便说一句,另一种解决方案是使用NSFetchedResultsController。它的设计目的是在发生故障时特别可靠和高效。

【讨论】:

  • NSFetchedResultsController 在 Cocoa 中不存在,仅在 Cocoa Touch 中存在。
  • 蒙迪,非常感谢!您的解决方案 1 挽救了我的一天,我快要疯了,现在我明白我需要将 MOC 作为我班级的财产。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 2010-12-22
    • 1970-01-01
    • 2012-10-24
    相关资源
    最近更新 更多