gpt4 book ai didi

iphone - 核心数据 - "NSObjectInaccessibleException - CoreData could not fulfill a fault"

转载 作者:太空狗 更新时间:2023-10-30 03:09:01 25 4
gpt4 key购买 nike

我是 Core data 的新手,仍在弄清楚具体细节,这个错误困扰了我几个小时,我似乎找不到解决方案。非常感谢任何帮助。

问题是这样的

我有两个 View ,它们从服务器获取数据并更新 UI。我是这样设置流程的

view1 -> 从服务器发送 HTTP 请求 - 接收回调 -> 将数据保存到 Coredata -> 从 Core Data 读取并显示在 UI 上(回调和保存/读取 Coredata 发生在 ViewController 中)

view2 -> 从服务器发送 HTTP 请求 - 接收回调 -> 将数据保存到 Coredata -> 从 Core Data 读取并显示在 UI 上(回调和保存/读取 Coredata 发生在 ViewController 中)

View 2 每 3 秒重复此过程,因为这是一个自动刷新屏幕。

问题是每当我尝试在 View 1 和 View 2 之间快速切换时,应用程序就会崩溃并出现上述错误。如果我在每个 View 上等待几秒钟(等待从服务器获取数据),它工作正常。我做错了什么,我需要修改什么?

- (void) refreshData {
[super refreshData];
[[UserDataFactory sharedSingleton] refreshLoggedInUserDataAndRespondTo:self user:self.user];
}

- (BOOL) refreshDataCallback:(QExtendedHTTPOperation*)responseOperation {
[self saveToCoreData: responseOperation.responseArray];
NSMutableArray *tmp = [[NSMutableArray alloc] initWithArray:[self readFromCoreData]];
[self setData: tmp];
[tmp release];
[self.tableView reloadData];
return YES;
}

- (void) saveToCoreData:(NSArray *) responseArray{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"CoreView1" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setReturnsObjectsAsFaults:NO];
NSError *error;
NSArray *items = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
[fetchRequest release];

for (NSManagedObject *managedObject in items) {
[self.managedObjectContext deleteObject:managedObject];
}

for (int i=0; i<[responseArray count]; i++) {
CoreView1 *coreView1_ = [NSEntityDescription insertNewObjectForEntityForName:@"CoreView1" inManagedObjectContext:self.managedObjectContext];
coreView_.id = [[responseArray objectAtIndex:i] id];
[self.managedObjectContext insertObject:coreView1_];
}
[self saveContext:self.managedObjectContext];
}

- (NSArray *) readFromCoreData{
NSEntityDescription *entity = [NSEntityDescription entityForName:@"CoreView1" inManagedObjectContext:self.managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:entity];
[fetchRequest setReturnsObjectsAsFaults:NO];
NSError *error;
NSMutableArray *fetchedObjects = [[self.managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy];
[fetchRequest release];
return [fetchedObjects autorelease];
}

这是我正在使用的示例代码,即使 View2 也具有相同的回调并遵循相同的流程。

编辑 1之前忘了提这个,我总是在 saveToCoreData 方法中得到错误。此外,还需要注意的一件事是,如果我删除删除对象的代码,它一切正常(我需要在保存更新数据之前从表中删除所有现有数据)。虽然不确定发生了什么。

最佳答案

删除删除代码使其工作的原因是因为您正在删除持久存储中的数据而不更新另一个 View ,该 View 仍然具有与仍在内存中的数据相关联的托管对象实例。请记住,虽然 Core Data 处理对象,但每个对象都必须在其后面的数据库中有一行。当您删除该行时,Core Data 会生气。

因此,要解决此问题并仍然删除您的数据,您应该让您的 View 监听 NSManagedObjectContextWillSaveNotification 和/或 NSManagedObjectContextDidSaveNotification 通知并使用最您商店中最新版本的数据。正是在这一点上,您应该丢弃您的 View 持有的任何核心数据对象,并从商店重新加载它们。

关于iphone - 核心数据 - "NSObjectInaccessibleException - CoreData could not fulfill a fault",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5591301/

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