对象管理器 getObject:self 方法上的 RestKit 和 Core Data 实体崩溃
Posted
技术标签:
【中文标题】对象管理器 getObject:self 方法上的 RestKit 和 Core Data 实体崩溃【英文标题】:RestKit and Core Data entity crash on objectManager getObject:self method 【发布时间】:2013-12-28 19:58:05 【问题描述】:我正在开发一个旨在在 ios 6 及更高版本下运行的 iPhone 应用程序。我在 iOs 7 64 位模拟器下遇到了这个问题。我正在使用 xcode 5.0.2。
我正在使用从 git 获得的 restKit 0.22.0,但在 v0.20.3 中遇到了完全相同的行为
当共享管理器进行 getObject:self 调用时,我的 iOs 应用程序的一个非常简单的部分不断抛出错误。
所有映射都正确完成,我知道这是因为第一次调用运行良好并设置了核心数据实体。
然而,如果我尝试刷新屏幕,它总是在 RKResponseMapperOperation.m 的第 454 行以 exc_bad_access 错误结束:
NSManagedObject *localObject = [self.managedObjectContext existingObjectWithID:objectID error:&blockError];
我检查了 self.managedObjectContext 和 objectId 的值,它们都已设置。
我想补充一点,只要索引与现有实体不同,向 CoreData 表添加新实体就可以正常工作。
正如我所说,背后的逻辑很简单,就是这样:
在 appDelegate 中设置映射:
RKEntityMapping *analyticsMapping = [RKEntityMapping mappingForEntityForName:@"MainAnalytics" inManagedObjectStore:objectManager.managedObjectStore];
[analyticsMapping addAttributeMappingsFromDictionary:@@"visits_today":@"dailyVisits",@"visits_this_month":@"monthlyVisits",@"percentNewVisits":@"newVisitors",@"pageviewsPerVisit":@"pagesVisit",@"avgTimeOnSite":@"visitDuration",@"date":@"date"];
analyticsMapping.identificationAttributes = @[@"date"];
RKResponseDescriptor *analyticsResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:analyticsMapping
pathPattern:@"analytics.json"
keyPath:nil
statusCodes:[NSIndexSet indexSetWithIndex:200]];
[objectManager addResponseDescriptor:analyticsResponseDescriptor];
在 NSManagedObject 中获取对象:
[objectManager getObject:self path:[NSString stringWithFormat:@"analytics.json"] parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)
if (self.delegate && [self.delegate respondsToSelector:@selector(analyticsLoaded:)])
[self.delegate analyticsLoaded:self];
failure:^(RKObjectRequestOperation *operation, NSError *error)
NSHTTPURLResponse* response = (NSHTTPURLResponse *)[error.userInfo valueForKey:@"AFNetworkingOperationFailingURLResponseErrorKey"];
Site* ewSite = [Site sharedManager];
switch (response.statusCode)
case 406:
DLog(@"Already logged In user");
break;
case 401:
[ewSite.user logout];
case 403:
break;
case 404:
DLog(@"error: %@", error);
default:
DLog(@"Uknown error: %@", error);
break;
];
最后,在 Core Data 中,实体被正确配置为索引的数据字段......再次,在第一次调用时,它正确加载和存储数据,添加新实体也很有效,我可以看到表变得新行...但是在尝试更新时它会崩溃。
我在这里很困惑,因为我在同一个应用程序中有另一个实体使用非常相似的逻辑,它就像一个魅力......
有人知道这里发生了什么吗?任何帮助将不胜感激。
先谢谢了。
【问题讨论】:
self
在您尝试使用之前是否已保存到上下文中?
是的,当我通过 NSFetchedResultsController 从上下文本身获取 self 时会出现异常。如果我在 Core Data 中创建一个新实体,我不会收到任何错误。然而,这是我在应用程序的另一部分中使用的逻辑,并且可以无缝运行。
它是在什么上下文中创建和保存的?这是在更新持久存储吗?
嗨@Wain。当错误被抛出时,它不是首先被创建的。它是从 fetchedResultController 中检索的,而 fetchedResultController 又从我的整个应用程序中使用的共享管理器中获取实体。最后,我不管理由 RestKit 直接管理的更新,但我想是的,错误是由 RestKit 尝试更新我商店中的实体引起的。
我猜问题是 RestKit 试图获取一个不存在的托管对象 id 的对象(因为它是临时的,或者因为它不在上下文中使用)。我真的想不出问题的另一个原因。除非该对象由于某种原因从上下文中删除...
【参考方案1】:
在花了一个星期天下午发现问题后,我终于找到了与 RestKit 无关的解决方案......
关于我如何在屏幕上显示核心数据实体的值的问题(其中一些值是唯一的,因此它正在提供某些标签的文本值...在分配值时,它似乎保留对核心数据实体的直接引用,这很可能导致跨线程错误...
我已经更改了我的应用程序这个特定部分的整个架构,以注意到当我不显示数据时,所有刷新都运行良好。
感谢韦恩的帮助。希望这会帮助其他有非常特定屏幕的人。
最好的,
【讨论】:
以上是关于对象管理器 getObject:self 方法上的 RestKit 和 Core Data 实体崩溃的主要内容,如果未能解决你的问题,请参考以下文章