Relacionamentos de mapeamento no RestKit por meio de uma matriz de IDs não funcionam

Estou tentando mapear usuários e grupos para objetos CoreData através do RestKit, mantendo o relacionamento entre os dois.

O JSON para os usuários é algo como

{"users":
  [{"fullname": "John Doe", "_id": "1"}
   ...
  ]
}

e o JSON para os grupos é algo como

{"groups":
  [{"name": "John's group", "_id": "a",
    "members": ["1", "2"]
   ...
  ]
}

Eu também tenho objetos Core Data correspondentes,User eGroup, com um mapeamento de relacionamento um-para-muitos entre grupos e usuários. A propriedade de relacionamento emGroup é chamadomembers e um separadoNSArray chamadomemberIDs contém a matriz de IDs de string de todos os usuários membros.

O que eu quero realizar no RestKit é carregar esses objetos e ter o relacionamento mapeado para mim. O código para carregar os usuários é um material padrão direto, e o código para carregar os grupos é algo como

RKObjectManager* objectManager = [RKObjectManager sharedManager];
RKManagedObjectMapping* groupMapping = [RKManagedObjectMapping mappingForClass:[Group class] inManagedObjectStore:objectManager.objectStore];
groupMapping.primaryKeyAttribute = @"identifier";
[groupMapping mapKeyPath:@"_id" toAttribute:@"identifier"];
[groupMapping mapKeyPath:@"name" toAttribute:@"name"];
[groupMapping mapKeyPath:@"members" toAttribute:@"memberIDs"];
[objectManager.mappingProvider setMapping:groupMapping forKeyPath:@"groups"];

// Create an empty user mapping to handle the relationship mapping
RKManagedObjectMapping* userMapping = [RKManagedObjectMapping mappingForClass:[User class] inManagedObjectStore:objectManager.objectStore];

[groupMapping hasMany:@"members" withMapping:userMapping];
[groupMapping connectRelationship:@"members" withObjectForPrimaryKeyAttribute:@"memberIDs"];

RKObjectRouter* router = objectManager.router;

[router routeClass:[Group class] toResourcePath:@"/rest/groups/:identifier"];
[router routeClass:[Group class] toResourcePath:@"/rest/groups/" forMethod:RKRequestMethodPOST];
// Assume url is properly defined to point to the right path...
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:url usingBlock:^(RKObjectLoader *loader) {}];

Quando executo esse código, recebo o seguinte aviso várias vezes (parece ser duas vezes por relacionamento):

2012-10-24 08:55:10.170 Test[35023:18503] W restkit.core_data.cache:RKEntityByAttributeCache.m:205 Unable to add object with nil value for attribute 'identifier': <User: 0x86f7fc0> (entity: User; id: 0x8652400 <x-coredata:///User/t01A9EDBD-A523-4806-AFC2-9B06873D764E531> ; data: {
    fullname = nil;
    identifier = nil;
})

O estranho é que o relacionamento é configurado corretamente (até mesmo olhou para o banco de dados sqlite, e tudo parece bem lá), mas eu não estou feliz com algo claramente errado no código do RestKit, e parece ter algo a ver com o falso mapeamento de usuários que eu crio no código acima (está vazio, já que não há nada para mapear na matriz de IDs).

Eu tentei alternativas, por exemplo, quando eu adiciono um mapeamento de caminho de chave:

[userMapping mapKeyPath:@"" toAttribute:@"identifier"];

Ele reclama, obviamente porque o caminho da chave está vazio

2012-10-24 09:24:11.735 Test[35399:14003] !! Uncaught exception !!
[<__NSCFString 0xa57f460> valueForUndefinedKey:]: this class is not key value coding-compliant for the key .

E se eu tentar usar o realUser mapeamento

[groupMapping hasMany:@"members" withMapping:[[RKObjectManager sharedManager].mappingProvider objectMappingForKeyPath:@"users"]];

Estou tendo o erro a seguir

2012-10-24 09:52:49.973 Test[35799:18403] !! Uncaught exception !!
[<__NSCFString 0xa56e9a0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key _id.
2012-10-24 09:52:49.973 Test[35799:18403] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<__NSCFString 0xa56e9a0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key _id.'

Parece que o RestKit está tentando mapear as cadeias de IDs na matriz memberIDs paraUser objetos, o que não faz qualquer sentido. Já vi exemplos em que o array de relacionamento é uma lista de dicionários com chaves (por exemplo, chamadaid) com o ID de referência para o outro objeto, por exemplo:

{"groups":
  [{"name": "John's group", "_id": "a",
    "members": [
      {"_id": "1"},
      {"_id": "2"}
     ]
   ...
  ]
}

Mas eu não quero mudar meu JSON dessa forma (além disso, espero que o RestKit seja flexível o suficiente para suportar o contrário).

Alguém sabe o que é a maneira correta de fazer esse tipo de mapeamento de relacionamento no RestKit?

Atualizar

Acabei modificando a interface REST para enviar uma lista de dicionários contendo os IDs de objeto do usuário (assim como o último exemplo acima) e consegui que funcionasse. Ainda não está completamente feliz com a configuração, mas o código agora parece

RKObjectManager* objectManager = [RKObjectManager sharedManager];
RKManagedObjectMapping* groupMapping = [RKManagedObjectMapping mappingForClass:[Group class] inManagedObjectStore:objectManager.objectStore];
groupMapping.primaryKeyAttribute = @"identifier";
[groupMapping mapKeyPath:@"_id" toAttribute:@"identifier"];
[groupMapping mapKeyPath:@"name" toAttribute:@"name"];
[groupMapping mapKeyPath:@"members._id" toAttribute:@"memberIDs"];
[objectManager.mappingProvider setMapping:groupMapping forKeyPath:@"groups"];

// Create an empty user mapping to handle the relationship mapping
RKManagedObjectMapping* userMapping = [RKManagedObjectMapping mappingForClass:[User class] inManagedObjectStore:objectManager.objectStore];
userMapping.primaryKeyAttribute = @"identifier";
[userMapping mapKeyPath:@"_id" toAttribute:@"identifier"];

[groupMapping hasMany:@"members" withMapping:userMapping];
[groupMapping connectRelationship:@"members" withObjectForPrimaryKeyAttribute:@"memberIDs"];

RKObjectRouter* router = objectManager.router;

[router routeClass:[Group class] toResourcePath:@"/rest/groups/:identifier"];
[router routeClass:[Group class] toResourcePath:@"/rest/groups/" forMethod:RKRequestMethodPOST];
// Assume url is properly defined to point to the right path...
[[RKObjectManager sharedManager] loadObjectsAtResourcePath:url usingBlock:^(RKObjectLoader *loader) {}];

Apenas no caso de isso ajudar alguém em uma situação semelhante. Ainda pode haver alguns problemas com a abordagem que eu tomei, mas até agora tudo bem (ele ainda lida com o carregamento fora de ordem, o que é bom) - ainda adoraria ouvir de alguém se há uma resposta para a minha pergunta original.

questionAnswers(1)

yourAnswerToTheQuestion