对象管理器 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 实体崩溃的主要内容,如果未能解决你的问题,请参考以下文章

工具栏上的按钮应该调用位置管理器方法

Java RMI之HelloWorld程序以及相关的安全管理器的知识

上下文管理器

列出队列管理器上的所有队列

REST API 检索的字段与对象管理器中的字段不对应

Python 多处理管理器类对象线程/进程安全