带有参数的 RestKit postObject 不更新发送对象
RestKit postObject with params does not update send object
我有路线
[RKRoute routeWithClass:[BBComment class] pathPattern:@"/comments" method:RKRequestMethodPOST]
和响应描述符
[RKResponseDescriptor responseDescriptorWithMapping:[BBComment apiMapping] method:RKRequestMethodPOST pathPattern:@"/comments" keyPath:nil statusCodes:successCodes]
当post object
时这里是路由
<RKClassRoute: 0x7fe2da8d65e0 objectClass=BBComment method=(POST) pathPattern=comment>
Printing description of routingMetadata:
{
query = {
parameters = {
"post_id" = 3205;
text = ds;
};
};
routing = {
parameters = {
};
route = "<RKClassRoute: 0x7fe2da8d65e0 objectClass=BBComment method=(POST) pathPattern=comment>";
};
}
在 post 新评论之前我创建了临时对象
BBComment *wComm = [BBComment MR_createEntity];
然后
[[RKObjectManager sharedManager] postObject:wComm path:nil parameters:sendCommentData success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
BBLog(@"ret:%@", wComm);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
}];
首先:
在RestKit运行创建
NSSet *temporaryObjects = [[managedObjectContext insertedObjects] filteredSetUsingPredicate:temporaryObjectsPredicate];
它是空的
但我认为这不是关键。
在服务器响应后,我得到了两个不同的对象 wComm 和 responseResult
为什么?我认为 RestKit 更新给定对象而不是创建新对象?
这里是POST
前后的对象
(lldb) po [wComm objectID]
0xd00000000050001c <x-coredata://C721341D-CAA2-4240-809B-D3F2D45032B5/BBComment/p20>
(lldb) po [mappingResult.firstObject objectID]
0xd00000000054001c <x-coredata://C721341D-CAA2-4240-809B-D3F2D45032B5/BBComment/p21>
我尝试在 post 之前保存对象(如果对象是临时的,就像 RestKit 那样)- 没有任何变化。
我想可能是不同的语境?但是没有
(lldb) po wComm.managedObjectContext
<NSManagedObjectContext: 0x7fa442c42080>
(lldb) po [mappingResult.firstObject managedObjectContext]
<NSManagedObjectContext: 0x7fa442c42080>
更新
不是,我得到的是对象,不是这里的数组
What is the relationship between the post object, in the RestKit postObject method, and the RKMappingResult it returns?
我找到了它不起作用的原因。因为在操作中没有设置targetObject
这个函数有问题
if (RKDoesArrayOfResponseDescriptorsContainMappingForClass(self.responseDescriptors, [object class])) operation.targetObject = object;
它适用于所有描述符,不仅用于匹配响应描述符,而且用于所有 WTF?
对象 return 否。
此对象的映射是 RKDynamicMapping。
发现问题
这里问题:没有使用setObjectMappingForRepresentationBlock
因为你会得到
po [mapping objectMappings]
<__NSArray0 0x7fcdd8d0ad30>(
)
并且RKMappingGraphVisitor的功能将不起作用
解决方案 1
获取RKOperation 并手动设置targetObject。但我认为这是不正确的。
更好的解决方案
使用类似
的东西
+ (RKDynamicMapping *)apiMapping {
RKDynamicMapping *mapping = [RKDynamicMapping new];
[mapping addMatcher:[RKObjectMappingMatcher matcherWithKeyPath:@"type" expectedValue:BBMessageType.plain objectMapping:[self plainTypeMapping]]];
return mapping;
}
我有路线
[RKRoute routeWithClass:[BBComment class] pathPattern:@"/comments" method:RKRequestMethodPOST]
和响应描述符
[RKResponseDescriptor responseDescriptorWithMapping:[BBComment apiMapping] method:RKRequestMethodPOST pathPattern:@"/comments" keyPath:nil statusCodes:successCodes]
当post object
时这里是路由<RKClassRoute: 0x7fe2da8d65e0 objectClass=BBComment method=(POST) pathPattern=comment>
Printing description of routingMetadata:
{
query = {
parameters = {
"post_id" = 3205;
text = ds;
};
};
routing = {
parameters = {
};
route = "<RKClassRoute: 0x7fe2da8d65e0 objectClass=BBComment method=(POST) pathPattern=comment>";
};
}
在 post 新评论之前我创建了临时对象
BBComment *wComm = [BBComment MR_createEntity];
然后
[[RKObjectManager sharedManager] postObject:wComm path:nil parameters:sendCommentData success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
BBLog(@"ret:%@", wComm);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
}];
首先:
在RestKit运行创建
NSSet *temporaryObjects = [[managedObjectContext insertedObjects] filteredSetUsingPredicate:temporaryObjectsPredicate];
它是空的
但我认为这不是关键。
在服务器响应后,我得到了两个不同的对象 wComm 和 responseResult
为什么?我认为 RestKit 更新给定对象而不是创建新对象?
这里是POST
前后的对象(lldb) po [wComm objectID]
0xd00000000050001c <x-coredata://C721341D-CAA2-4240-809B-D3F2D45032B5/BBComment/p20>
(lldb) po [mappingResult.firstObject objectID]
0xd00000000054001c <x-coredata://C721341D-CAA2-4240-809B-D3F2D45032B5/BBComment/p21>
我尝试在 post 之前保存对象(如果对象是临时的,就像 RestKit 那样)- 没有任何变化。
我想可能是不同的语境?但是没有
(lldb) po wComm.managedObjectContext
<NSManagedObjectContext: 0x7fa442c42080>
(lldb) po [mappingResult.firstObject managedObjectContext]
<NSManagedObjectContext: 0x7fa442c42080>
更新
不是,我得到的是对象,不是这里的数组
What is the relationship between the post object, in the RestKit postObject method, and the RKMappingResult it returns?
我找到了它不起作用的原因。因为在操作中没有设置targetObject
这个函数有问题
if (RKDoesArrayOfResponseDescriptorsContainMappingForClass(self.responseDescriptors, [object class])) operation.targetObject = object;
它适用于所有描述符,不仅用于匹配响应描述符,而且用于所有 WTF?
对象 return 否。
此对象的映射是 RKDynamicMapping。
发现问题
这里问题:没有使用setObjectMappingForRepresentationBlock
因为你会得到
po [mapping objectMappings]
<__NSArray0 0x7fcdd8d0ad30>(
)
并且RKMappingGraphVisitor的功能将不起作用
解决方案 1
获取RKOperation 并手动设置targetObject。但我认为这是不正确的。
更好的解决方案
使用类似
的东西+ (RKDynamicMapping *)apiMapping {
RKDynamicMapping *mapping = [RKDynamicMapping new];
[mapping addMatcher:[RKObjectMappingMatcher matcherWithKeyPath:@"type" expectedValue:BBMessageType.plain objectMapping:[self plainTypeMapping]]];
return mapping;
}