gpt4 book ai didi

iphone - 当 HTTP 服务更新对象时,CoreData 无法解决错误

转载 作者:行者123 更新时间:2023-12-03 18:41:57 25 4
gpt4 key购买 nike

我想我理解错误消息:CoreData 无法完成故障,但我不确定应该如何处理它。

我们有一个应用程序,我们使用 Core Data 来保存从 JSON 服务返回的数据。今天我正在做以下事情。

  1. 从持久存储中获取本地对象并返回到 UI
  2. 询问服务器对象是否已更新 - 当我得到答案时,我会更新 Core Data 托管对象
  3. 使用更新后的对象更新 UI

问题是;即使我不使用多线程,当 HTTP 请求删除我的 UI 保留的托管对象时,有时也会出现错误。我尝试获取 returnsObjectsAsFaults 为 NO 的对象。我认为这样我就可以访问托管对象的所有关系和属性,即使它被删除了(只要我的 UI 保留了它)。

我该如何解决这个问题?

我想我可以使用单独的 NSManagedObjectContext 进行读取和写入。我做了这个测试:

MyAuthorMO *authorUpdate = [[MyAuthorMO alloc] init]; // I have made this init insert the object into the updateContext
authorUpdate.firstname = @"Hans";
authorUpdate.lastname = @"Wittenberg";
authorUpdate.email = @"Hans@somedomain.no";

NSManagedObjectContext *updateContext = [[MyCoreManager getInstance] managedObjectContext];

NSError *error = nil;
[updateContext save:&error];

NSManagedObjectContext *readContext = [[MyCoreManager getInstance] readOnlyContext];

NSFetchRequest *fetchRequest = [managedObjectModel fetchRequestFromTemplateWithName:@"authorByEmail" substitutionVariables:[NSDictionary dictionaryWithObject:@"Hans@somedomain.no" forKey:@"EMAIL"]];
[fetchRequest setReturnsObjectsAsFaults:NO];

NSArray *authors = [readContext executeFetchRequest:fetchRequest error:&error];

MyAuthorMO * readAuthor = [authors objectAtIndex:0];

// Delete the author with update context:
[updateContext deleteObject:authorUpdate];
[updateContext save:&error];

NSLog(@"Author: %@ %@, (%@)", readAuthor.firstname, readAuthor.lastname, readAuthor.email);

只要我使用 readContext 进行获取,日志就可以正常输出。如果我使用 updateContext 进行获取,则会出现异常。这看起来很有希望,但我担心后期会遇到问题。迟早我可能会尝试访问未完全获取的属性(错误)。我怎样才能实现我正在寻找的行为?

最佳答案

您不应该保留上下文已释放的托管对象。让上下文为你做这件事。

问题是托管对象可以作为故障对象或已实现的对象存在。当您保留一个时,您可能会保留不包含数据的故障。即使您确实保留了实际的对象,一旦与上下文分离,该对象也可能无法正常运行。

为了处理您的场景,您需要 UI 上下文,然后需要服务器上下文。在任一上下文进行更改后,您应该合并上下文以确保两者都相对于存储正确更新。

您的 UI 应配置为反射(reflect)数据模型的状态,数据模型的某些部分不应依赖于 UI 的状态。

关于iphone - 当 HTTP 服务更新对象时,CoreData 无法解决错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3680921/

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