gpt4 book ai didi

iphone - 来自 Core Data : NSInvalidArgumentException, 的隐秘错误原因:referenceData64 仅为抽象类定义

转载 作者:行者123 更新时间:2023-12-03 18:15:07 31 4
gpt4 key购买 nike

我正在开发一个 iPhone 应用程序,它从 XML 文件读取数据,将它们转换为核心数据托管对象并保存它们。

该应用程序主要在包含约 150 个对象的较小数据集/XML 上运行良好。我之所以这么说,主要是因为 10% 的情况下,我在尝试保存上下文时会从 CoreData 收到以下异常:

* 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“* -_referenceData64 仅为抽象类定义。定义 -[NSTemporaryObjectID_default _referenceData64]!'

在更大的数据集(~2000)上,这种情况每次都会发生,但不是在同一个地方。它可能会在第 137 条记录、第 580 条记录或最后一条记录上失败。我尝试过移动保存点(每个对象,每 10 个对象,在所有对象都分配/初始化后保存),但我总是遇到上面的异常。

我在 Google 上搜索了该异常(exception)情况,发现有人遇到了相同的问题,但没有看到任何解决方案。

我的下一步是简化托管对象和关系,直到该错误停止并从那里开始构建以隔离问题。最后的手段是放弃 Core Data,直接存储到 sqllite 中。

感谢您的帮助!

最佳答案

我也有同样的问题。它适用于较小的数据集,但对于较大的数据集,我收到“_referenceData64 仅为抽象类定义”错误。我的模型中没有抽象实体。

编辑:

我想我已经解决了这个问题。我的问题是我的线程困惑。以下是我修复该问题所遵循的指南:

  1. 我在线程中解析 XML 数据。在启动所述线程时,使用与主线程的 NSManagedObjectContext 相同的持久存储协调器创建一个新的 NSManagedObjectContext。
  2. 您在线程中创建的任何新对象都应该为线程的 NSManagedObjectContext 创建。如果必须从主线程的 NSManagedObjectContext 复制对象,请按 ID 复制。即
    NSManagedObjectID *objectID = [foo objectID];<br/>
    FooClass *newFoo = [(FooClass*)[threadManagedObjectContext objectWithID:objectID] retain]
  3. 完成解析后,您需要保存对线程的 NSManagedObjectContext 所做的更改。您必须锁定持久存储协调器。我使用了以下(不完整的代码):

`

 - (void)onFinishParsing {  
// lock the store we share with main thread's context
[persistentStoreCoordinator lock];

// save any changes, observe it so we can trigger merge with the actual context
@try {
[threadManagedObjectContext processPendingChanges];
}
@catch (NSException * e) {
DLog(@"%@", [e description]);
[persistentStoreCoordinator unlock];
}
@finally {
// pass
}

NSNotificationCenter *dnc = [NSNotificationCenter defaultCenter];
[dnc addObserver:self selector:@selector(threadControllerContextDidSave:) name:NSManagedObjectContextDidSaveNotification object:threadManagedObjectContext];
@try {
NSError *error;
if (![threadManagedObjectContext save:&error]) {
DLog(@"%@", [error localizedDescription]);
[persistentStoreCoordinator unlock];
[self performSelectorOnMainThread:@selector(handleSaveError:) withObject:nil waitUntilDone:NO];
}
} @catch (NSException *e) {
DLog(@"%@", [e description]);
[persistentStoreCoordinator unlock];
} @finally {
// pass
}
[dnc removeObserver:self name:NSManagedObjectContextDidSaveNotification object:threadManagedObjectContext];

[self performSelectorOnMainThread:@selector(parserFinished:) withObject:nil waitUntilDone:NO];
}

// Merging changes causes the fetched results controller to update its results
- (void)threadControllerContextDidSave:(NSNotification*)saveNotification {
// need to unlock before we let main thread merge
[persistentStoreCoordinator unlock];
[self performSelectorOnMainThread:@selector(mergeToMainContext:) withObject:saveNotification waitUntilDone:YES];
}

- (void)mergeToMainContext:(NSNotification*)saveNotification {
NSError *error;
[managedObjectContext mergeChangesFromContextDidSaveNotification:saveNotification];
if (![managedObjectContext save:&error]) {
DLog(@"%@", [error localizedDescription]);
[self handleSaveError:nil];
}
}

`

关于iphone - 来自 Core Data : NSInvalidArgumentException, 的隐秘错误原因:referenceData64 仅为抽象类定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2009399/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com