我正在尝试使用RKMappingOperation
手动执行对象映射,但似乎它没有连接RKEntityMapping
中设置的关系。
我创建了一个演示项目,你可以在这里查看:https://github.com/HiveHicks/RKMappingOperationTest
模型中有两个实体:Employee
和Department
,调用多对一关系(部门可以有多个员工,一个员工只能在一个部门工作)。还有一个名为TestOperation
的类,它使用RKMappingOperation
在后台执行映射。正如您在-[TestOperation mappingForObject:]
中看到的,我为员工映射建立了一个连接,如下所示:
[mapping addConnectionForRelationship:EmployeeRelationships.department connectedBy:@{
EmployeeAttributes.departmentGuid : DepartmentAttributes.guid
}];
但是,当操作完成时,映射的托管对象具有所有属性,但没有关系
我该如何解决这个问题?
更新
事实证明RKMapperOperation
同步映射托管对象的属性,但为连接关系创建异步操作。这导致以下情况:
-[RKMapperOperation execute:]
返回时,我保存上下文。所有属性都在那里,但是关系不是,因为RKRelationshipConnectionOperation
被添加到队列中,我现在就是这样。RKRelationshipConnectionOperation
仅设置关系,不保存上下文。RKMapperOperationDelegate
的{{1}}方法在 mapperDidFinishMapping:
开始之前被称为 下面的图片证明了我刚刚说的话
因此,我现在看到的解决方案是在RKRelationshipConnectionOperation
中创建新的操作队列,向其添加SyncOperation
,然后等待,直到此内部队列中的所有操作完成执行。哇。听起来像个黑客。我现在就试一试。
更新2
它适用于我描述的解决方案。解决了。我已经提交了最终版本。
答案 0 :(得分:0)
解决方案是创建临时操作队列,向其添加RKMapperOperation
并在此队列上调用waitUntilAllOperationsAreFinished
。之后,您的上下文将保证设置所有需要的关系。
工作项目发布在github上:https://github.com/HiveHicks/RKMappingOperationTest
id<RKManagedObjectCaching> cache = [[RKInMemoryManagedObjectCache alloc] initWithManagedObjectContext:_context];
RKManagedObjectMappingOperationDataSource *dataSource =
[[RKManagedObjectMappingOperationDataSource alloc] initWithManagedObjectContext:_context cache:cache];
RKMapperOperation *mapperOperation = [[RKMapperOperation alloc] initWithRepresentation:objects mappingsDictionary:@{
[NSNull null] : [self mapping]
}];
mapperOperation.mappingOperationDataSource = dataSource;
mapperOperation.delegate = self;
NSOperationQueue *operationQueue = [NSOperationQueue new];
operationQueue.name = @"Internal SyncOperation queue";
[operationQueue addOperation:mapperOperation];
[operationQueue waitUntilAllOperationsAreFinished];
[_context performBlockAndWait:^{
NSError *saveError = nil;
if (![_context saveToPersistentStore:&saveError]) {
NSLog(@"Error saving to store: %@", saveError);
}
}];