RKMappingOperation不连接关系

时间:2014-07-03 16:05:03

标签: ios objective-c restkit

我正在尝试使用RKMappingOperation手动执行对象映射,但似乎它没有连接RKEntityMapping中设置的关系。

我创建了一个演示项目,你可以在这里查看:https://github.com/HiveHicks/RKMappingOperationTest

模型中有两个实体:EmployeeDepartment,调用多对一关系(部门可以有多个员工,一个员工只能在一个部门工作)。还有一个名为TestOperation的类,它使用RKMappingOperation在后​​台执行映射。正如您在-[TestOperation mappingForObject:]中看到的,我为员工映射建立了一个连接,如下所示:

    [mapping addConnectionForRelationship:EmployeeRelationships.department connectedBy:@{
            EmployeeAttributes.departmentGuid : DepartmentAttributes.guid
    }];

但是,当操作完成时,映射的托管对象具有所有属性,但没有关系

enter image description here

我该如何解决这个问题?

更新

事实证明RKMapperOperation同步映射托管对象的属性,但为连接关系创建异步操作。这导致以下情况:

  1. -[RKMapperOperation execute:]返回时,我保存上下文。所有属性都在那里,但是关系不是,因为RKRelationshipConnectionOperation被添加到队列中,我现在就是这样。
  2. RKRelationshipConnectionOperation仅设置关系,不保存上下文。
  3. 我留下了一个肮脏的上下文,不知道何时保存它,因为RKMapperOperationDelegate的{​​{1}}方法在 mapperDidFinishMapping:开始之前被称为
  4. 下面的图片证明了我刚刚说的话

    enter image description here

    因此,我现在看到的解决方案是在RKRelationshipConnectionOperation中创建新的操作队列,向其添加SyncOperation,然后等待,直到此内部队列中的所有操作完成执行。哇。听起来像个黑客。我现在就试一试。

    更新2

    它适用于我描述的解决方案。解决了。我已经提交了最终版本。

1 个答案:

答案 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);
    }
}];