示例: 我们有学生和大学:
student {
id,
name,
university
}
university {
id,
name
}
现在考虑将以下json-object作为服务器的响应,应使用RestKit建模:
{
"students": [{
"id" : 1,
"name" : "bob",
"university":{
"id" : 1,
"name" = "blub-university" }
},
{
"id" : 2,
"name" : "anton",
"university":{
"id" : 1 }
}
]
}
由于anton已经知道大学id = 1的内容,所以只传递了id。
我的问题: 我在RestKit中使用了学生和大学之间的关系,但是 Restkit在处理响应时会覆盖大学对象。处理此类响应的正确方法是什么?
我认为这是Restkit中的一个Bug。我认为它首先创建了对象:bob和anton,还有大学的两个对象。 然后它链接这些对象,但这不起作用,因为它创建了两个大学对象!
更新: 我的理论错了,我在创建对象时向weskit-API添加了输出。
我的错误: 我没有根据JSON SYNTAX设置关系的多重属性。 RESTKIT工作很精细,但也许休息套件中的一些断言可以,以防止这个问题: - )。
答案 0 :(得分:0)
假设这是您收到的回复,并且您保证在没有回复之前让大学的名称返回,我会像这样处理它。
(半伪代码)
for(NSDictionary *dict in JSON){
Student *stu = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:context];
[stu set_Id:[dict objectForId:@"id"]];
[stu set_Name:[dict objectForId:@"name"]];
NSDictionary *uniDictionary = [dict objectForId:@"university"];
University *uni = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:context];
[uni set_Id:[uniDictionary objectId:@"id"]];
if (uniDictionary objectForKey:@"name"] != nil) {
[uni set_Id:[uniDictionary objectId:@"name"]];
}
else {
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"University"];
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"id == %d", [uniDictionary objectId:@"id"]];
NSError *error;
NSArray *arr = [context executeFetchRequest:fetchRequest error:&error];
University *uniWithName = arr[0];
[uni set_Name:uniWithName.name];
}
}
if-else将起作用,因为具有名称的大学将在上下文中并且可以轻松获取。