2013-08-04 38 views
1

这是RestKit中的错误还是我没有正确配置?RestKit Reflexive关系实体无限循环

JSON:

[ 
{ 
    "name": "Test 1", 
    "subtests": [ 
     { 
      "name": "Subtest 1" 
     }, 
     { 
      "name": "Subtest 2" 
     }, 
     { 
      "name": "Subtest 3" 
     } 
    ], 
    "children": ["Test 1"] 
}, 
{ 
    "name": "Test 2", 
    "subtests": [ 
     { 
      "name": "Subtest 4" 
     }, 
     { 
      "name": "Subtest 5" 
     }, 
     { 
      "name": "Subtest 6" 
     } 
    ], 
    "children": ["Test 2"] 
} 
] 

映射提供:

+ (RKMapping *)testMapping 
{ 
    RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass([Test class]) inManagedObjectStore:[InfoDataModel sharedDataModel].objectStore]; 

    mapping.identificationAttributes = @[ @"name" ]; 

    [mapping addAttributeMappingsFromArray:@[ @"name" ]]; 

    [mapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"children" toKeyPath:@"children" withMapping:[MappingProvider reflexiveTestMapping]]]; 
    [mapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"subtests" toKeyPath:@"subtests" withMapping:[MappingProvider subTestMapping]]]; 

    return mapping; 
} 

+ (RKMapping *)reflexiveTestMapping 
{ 
    RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass([Test class]) inManagedObjectStore:[InfoDataModel sharedDataModel].objectStore]; 

    mapping.identificationAttributes = @[ @"name" ]; 

    [mapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:nil toKeyPath:@"name" withMapping:[MappingProvider testMapping]]]; 

    return mapping; 
} 

+ (RKMapping *)subTestMapping; 
{ 
    RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass([SubTest class]) inManagedObjectStore:[InfoDataModel sharedDataModel].objectStore]; 

    mapping.identificationAttributes = @[ @"name" ]; 

    [mapping addAttributeMappingsFromArray:@[ @"name" ]]; 

    return mapping;  
} 

我把它从这里:

- (IBAction)loadTestAndSubtestEntity:(id)sender { 
    RKLogConfigureByName("RestKit", RKLogLevelWarning); 
    RKLogConfigureByName("RestKit/ObjectMapping", RKLogLevelTrace); 
    RKLogConfigureByName("RestKit/Network", RKLogLevelTrace); 

    NSString *filePathComponent = [self.pathComponent  stringByAppendingPathComponent:@"test.json"]; 
    [[InfoDataModel sharedDataModel] importDataFromJsonFilePathComponent:filePathComponent withMapping:[MappingProvider testMapping]]; 
} 

无输出 我使用下面的映射时得到inifinite循环自挂起时生成: self.storePath正在初始化用文件路径进行归类。

- (void)importDataFromJsonFilePathComponent:(NSString *)jsonFilePathComponent withMapping:(RKMapping *)mapping 
{ 
    if (self.storePath) { 
     NSString *jsonFilePath = [RKApplicationDataDirectory() stringByAppendingPathComponent:jsonFilePathComponent]; 
     MyLog(@"InfoDataModel. JSON file: %@", jsonFilePath); 
     RKManagedObjectImporter *importer = [[RKManagedObjectImporter alloc] initWithManagedObjectModel:self.objectStore.managedObjectModel storePath:self.storePath]; 
     importer.resetsStoreBeforeImporting = NO; 
     MyLog(@"InfoDataModel. Store: %@", self.storePath); 

     NSError *error = nil; 
     [importer importObjectsFromItemAtPath:jsonFilePath 
            withMapping:mapping 
             keyPath:nil 
             error:&error]; 

     BOOL success = [importer finishImporting:&error]; 
     if (success) { 
      [importer logSeedingInfo]; 
     } 
    } 
} 

回答

0

一个“解决方案”出这个递归是限制基于估计跳跃 递归调用的maximun数量,在这种情况下,两周跳。

+ (RKMapping *)reflexiveTestMapping 
{ 
    RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass([Test class]) inManagedObjectStore:[InfoDataModel sharedDataModel].objectStore]; 

    mapping.identificationAttributes = @[ @"name" ]; 

    // No more recursion calls from this point 

    return mapping; 
} 
+0

是不是最好只*修复递归*? –

1

问题是你有2个方法正在相互调用。该testMapping方法调用reflexiveTestMapping方法由于线路:

[mapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"children" toKeyPath:@"children" withMapping:[MappingProvider reflexiveTestMapping]]]; 

而且reflexiveTestMapping方法调用testMapping方法由于线路:

[mapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:nil toKeyPath:@"name" withMapping:[MappingProvider testMapping]]]; 

这是没有什么直接做硬圆与映射关联,并且与您尝试创建映射的方式简单相关。

映射不需要这样创建,因为JSON中的children关系只包含名称而不包含完整对象。

0

这是我的固定的递归:

+ (RKMapping *)testMapping 
{ 
    RKEntityMapping *innerMapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass([Test class]) inManagedObjectStore:[InfoDataModel sharedDataModel].objectStore]; 
    innerMapping.identificationAttributes = @[ @"name" ]; 

    RKEntityMapping *mapping = [RKEntityMapping mappingForEntityForName:NSStringFromClass([Test class]) inManagedObjectStore:[InfoDataModel sharedDataModel].objectStore]; 
    mapping.identificationAttributes = @[ @"name" ]; 
    [mapping addAttributeMappingsFromArray:@[ @"name" ]]; 

    [mapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"children" toKeyPath:@"children" withMapping:innerMapping]]; 

    return mapping; 
} 
0

这就是我与迅速

class var keyAll: [String] { 
    return [ 
     "title", 
     "desc" 
    ] 
    } 

    class var objectMapping: RKObjectMapping { 
    let childMapping = RKObjectMapping(forClass: Category.self) 
    childMapping.addAttributeMappingsFromArray(keyAll) 

    let mapping = RKObjectMapping(forClass: Category.self) 
    mapping.addAttributeMappingsFromArray(keyAll) 

    mapping.addPropertyMapping(RKRelationshipMapping(fromKeyPath: keyChilds, toKeyPath: keyChilds, withMapping: childMapping)) 
    return mapping 
    }