经过长时间的研究后,我正在做这篇文章,但我真的很想找到解决问题的最佳方法。
我对resKit和CoreData都很新......无论如何,我在CoreData中映射并保存从Web服务收到的JSON。
这里有一些代码:
//ResKit and Core Data initialization here
...
//Initialization RKObjectManager
RKObjectManager *objectManager = [RKObjectManager managerWithBaseURL:[NSURL URLWithString:@"http://http://www.myWebService.com"]];
objectManager.managedObjectStore = managedObjectStore;
[RKObjectManager setSharedManager:objectManager];
//Categories Mapping and descriptor
RKEntityMapping *categoriesMapping = [RKEntityMapping mappingForEntityForName:@"XNCategory" inManagedObjectStore:managedObjectStore];
[categoriesMapping addAttributeMappingsFromDictionary:@{
@"id": @"idCategory",
@"desc": @"desc",
@"idFam":@"idFam"}];
categoriesMapping.identificationAttributes = @[ @"idCategory" ];
RKResponseDescriptor *categoriesDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:categoriesMapping
method:RKRequestMethodGET pathPattern:@"getData.asp" keyPath:@"categories"
statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
//Families Mapping and descriptor
RKEntityMapping *familiesMapping = [RKEntityMapping mappingForEntityForName:@"XNFamily" inManagedObjectStore:managedObjectStore];
[familiesMapping addAttributeMappingsFromDictionary:@{
@"id": @"idFam",
@"desc": @"desc"}];
familiesMapping.identificationAttributes = @[ @"idFam" ];
RKResponseDescriptor *familiesDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:familiesMapping
method:RKRequestMethodGET pathPattern:@"getData.asp" keyPath:@"families"
statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
//Relation between the 2 mapping
NSEntityDescription *categoryEntity = [NSEntityDescription entityForName:@"XNCategory"
inManagedObjectContext:[managedObjectStore mainQueueManagedObjectContext]];
NSRelationshipDescription *userRelationshipFrom = [categoryEntity relationshipsByName][@"family"];
RKConnectionDescription *connectionUserMessageFrom = [[RKConnectionDescription alloc]
initWithRelationship:userRelationshipFrom attributes:@{ @"idFam": @"idFam" }];
[categoriesMapping addConnection:connectionUserMessageFrom];
//Finally add the descriptor to the object manager
[objectManager addResponseDescriptor:categoriesDescriptor];
[objectManager addResponseDescriptor:familiesDescriptor];
在另一个视图控制器中,当我需要下载所有数据时:
[[RKObjectManager sharedManager] getObjectsAtPath:@"getData.asp" parameters:@{kAuthKeyName : kAuthKeyValue} success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
//Success block
}failure:^(RKObjectRequestOperation *operation, NSError *error) {
//Failure Block
}];
此代码正确下载并自动保存到CoreData中的持久存储保留实体之间的关系。
现在我的问题:有什么方法可以避免这种自动保存吗?因为我需要处理从webService检索到的数据,并且只有在我决定时才保存它们。
我发现这篇文章非常有用,或者至少为我开始研究提供了很好的意见:Best practice for temporary objects in RestKit with Core Data,但这是2012年的帖子,我不知道是否有什么变化或者现在是否有变化是一个更好的解决方案。
更重要的是,我需要的是一种方法,允许使用ResKit进行映射,以便所有接收的数据都能正确地实体映射,尊重我创建的所有 NSRelationshipDescription 和手动管理保存到持久存储。
非常感谢您的耐心和帮助。
答案 0 :(得分:0)
一般来说,您链接的答案仍然有效。在映射完成后,RestKit没有为不保存上下文添加特殊支持(它仍然自动完成)。 RestKit创建和管理Core Data的方式虽然有所改变。您仍然可以在Core Data之外创建对象,然后在准备保存时将它们映射到托管对象。试图篡改RestKit创建的Core Data设置可能会导致您将来出现问题(如果不是立即),并且维护2个不同的持久存储可能比在Core Data之外准备数据然后在准备好时导入它更复杂保存。