【发布时间】:2014-01-31 10:45:18
【问题描述】:
我正在使用 RestKit 使用以下行通过网络将数据发布到我的 Rest API:
[[RKObjectManager sharedManager] postObject:list path:@"api/lists" parameters:nil
success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)
我要发布的对象list 具有名为tasks 的附加数据,它位于其他表中,即标准的一对多关系。现在,当我看到 POST 请求的日志时,它的正文仅包含 list 对象数据,如下所示
request.body={"listID":0,"listName":"List 3","listSyncStatus":false}
但没有相关的任务数据。我的问题是如何发布整个“列表”对象及其相关任务?谁能指导我正确的方法是什么?
我在app Delegate类中的Request Descriptor如下
//INVERSE MAPPING TO PERFORM POST FOR LIST
RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[listEntityMapping inverseMapping]
objectClass:[List class]
rootKeyPath:nil
method:RKRequestMethodPOST];
这是我的listEnityMapping
//LIST RELATED REQUESTS
NSDictionary *listObjectMapping = @{
@"listID" : @"listID",
@"listName" : @"listName",
@"listSyncStatus" : @"listSyncStatus"
};
RKEntityMapping *listEntityMapping = [RKEntityMapping mappingForEntityForName:@"List" inManagedObjectStore:managedObjectStore];
[listEntityMapping addAttributeMappingsFromDictionary:listObjectMapping];
listEntityMapping.identificationAttributes = @[ @"listID" ];
我确实有如下关系映射:
[listEntityMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"tasks"
toKeyPath:@"tasks"
withMapping:taskEntityMapping]];
我传入的 json 数据是这样格式化的
GET www.mydomain.com/api/lists
[ { "listID" : "96",
"listName" : "List 1",
"listSyncStatus" : "1",
"tasks" : [ { "taskCompletionStatus" : "1",
"taskID" : "67",
"taskName" : "Task 2",
"taskSyncStatus" : "1"
},
{ "taskCompletionStatus" : "1",
"taskID" : "66",
"taskName" : "Task 1",
"taskSyncStatus" : "1"
}
]
},
{ "listID" : "97",
"listName" : "List 2",
"listSyncStatus" : "1",
"tasks" : [ { "taskCompletionStatus" : "1",
"taskID" : "69",
"taskName" : "Task 1",
"taskSyncStatus" : "1"
},
{ "taskCompletionStatus" : "1",
"taskID" : "68",
"taskName" : "Task 1",
"taskSyncStatus" : "1"
}
]
}
]
记录跟踪 我正在了解可能是什么问题。 在执行发布之前出现以下日志跟踪
Mapping values from object <List: 0xc1332a0> (entity: List; id: 0xc026ec0 <x-coredata://8F498A46-254D-49F3-BEF1-0B675E5AE9D9/List/p1> ; data: {
listID = 0;
listName = "List 1";
listSyncStatus = 0;
tasks = (
"0xc030f30 <x-coredata://8F498A46-254D-49F3-BEF1-0B675E5AE9D9/Task/p1>"
);
}) ((null)) to object {
} with object mapping (null)
2014-01-31 17:02:30.229 RKGist[2455:70b] T restkit.object_mapping:RKMappingOperation.m:550 Mapping attribute value keyPath 'listID' to 'listID'
2014-01-31 17:02:30.230 RKGist[2455:70b] T restkit.object_mapping:RKMappingOperation.m:572 Mapped attribute value from keyPath 'listID' to 'listID'. Value: 0
2014-01-31 17:02:30.230 RKGist[2455:541f] D restkit.object_mapping:RKPropertyInspector.m:130 Cached property inspection for Class 'NSMutableDictionary': {
fileHFSFlags = {
isPrimitive = 1;
keyValueCodingClass = NSNumber;
name = fileHFSFlags;
};
fileHFSResourceForkSize = {
isPrimitive = 1;
keyValueCodingClass = NSNumber;
name = fileHFSResourceForkSize;
};
}
2014-01-31 17:02:30.230 RKGist[2455:70b] T restkit.object_mapping:RKMappingOperation.m:550 Mapping attribute value keyPath 'listName' to 'listName'
2014-01-31 17:02:30.231 RKGist[2455:70b] T restkit.object_mapping:RKMappingOperation.m:572 Mapped attribute value from keyPath 'listName' to 'listName'. Value: List 1
2014-01-31 17:02:30.231 RKGist[2455:70b] T restkit.object_mapping:RKMappingOperation.m:550 Mapping attribute value keyPath 'listSyncStatus' to 'listSyncStatus'
2014-01-31 17:02:30.231 RKGist[2455:70b] T restkit.object_mapping:RKMappingOperation.m:572 Mapped attribute value from keyPath 'listSyncStatus' to 'listSyncStatus'. Value: 0
2014-01-31 17:02:30.232 RKGist[2455:70b] D 2014-01-31 17:38:29.514 RKGist[2686:70b] D
restkit.network:RKObjectParameterization.m:128 Serialized __NSCFNumber value at keyPath to __NSCFBoolean (0)
2014-01-31 17:38:29.514 RKGist[2686:70b] D restkit.object_mapping:RKMappingOperation.m:1021 Finished mapping operation successfully...
2014-01-31 17:38:29.516 RKGist[2686:70b] T restkit.network:RKObjectRequestOperation.m:178 POST 'http://mydomain.com/api/lists':
request.headers={
Accept = "application/json";
"Accept-Language" = "en;q=1, fr;q=0.9, de;q=0.8, zh-Hans;q=0.7, zh-Hant;q=0.6, ja;q=0.5";
"Content-Type" = "application/json; charset=utf-8";
"User-Agent" = "RKGist/1.0 (iPhone Simulator; iOS 7.0.3; Scale/2.00)";
}
request.body={"listID":0,"listName":"List 1","listSyncStatus":false}
2014-01-31 17:38:30.227 RKGist[2686:3603] T restkit.network:RKObjectRequestOperation.m:248 POST 'http://mydomain.com/api/lists' (200 OK / 1 objects) [request=0.7102s mapping=0.0012s total=0.7119s]:
response.headers={
"Cache-Control" = "no-cache, no-store, must-revalidate";
Connection = "Keep-Alive";
"Content-Length" = 0;
"Content-Type" = "application/json";
Date = "Fri, 31 Jan 2014 12:38:30 GMT";
"Keep-Alive" = "timeout=5, max=384";
Server = Apache;
"X-Powered-By" = "Fat-Free Framework";
}
response.body=
2014-01-31 17:38:30.228 RKGist[2686:70b] Success
即问题是使用此字典完成逆映射时找不到任何关系
NSDictionary *listObjectMapping = @{
@"listID" : @"listID",
@"listName" : @"listName",
@"listSyncStatus" : @"listSyncStatus"
};
我的问题是应该将什么添加到此字典中,以便逆向映射与任务成功发生?目前列表元素已正确映射,但没有关联的任务。
【问题讨论】:
-
应该颠倒的
listEntityMapping是什么关系?您可能希望显式创建请求映射。 -
@Wain 为有问题的 listEnityMapping 添加了代码。
-
@Wain 添加了有问题的关系代码。
-
这表明
list没有关联的任务,因为反向映射应该可以工作。打开跟踪日志,看看它说了什么。在映射开始之前调试以记录完整的list对象。 -
@Wain 我无法理解您的建议,请详细说明。
标签: ios http-post restkit restkit-0.20