2013-08-04 35 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 
    }