带params的RestKit postObject不会更新发送对象

时间:2015-10-14 12:07:08

标签: ios rest core-data restkit

我有路线

  [RKRoute routeWithClass:[BBComment class] pathPattern:@"/comments" method:RKRequestMethodPOST]

和响应描述符

[RKResponseDescriptor responseDescriptorWithMapping:[BBComment apiMapping] method:RKRequestMethodPOST pathPattern:@"/comments" keyPath:nil statusCodes:successCodes]

此处发布对象时的路线

<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>";
    };
}

在发布新评论之前,我创建临时对象

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>

我在发布之前尝试保存对象(如果对象是临时的,就像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?

1 个答案:

答案 0 :(得分:0)

我发现为什么它不起作用。因为targetObject没有在操作中设置

此功能存在问题

if (RKDoesArrayOfResponseDescriptorsContainMappingForClass(self.responseDescriptors, [object class])) operation.targetObject = object;
  1. 所有描述符的工作,不仅是匹配responseDescriptors,还是所有WTF?

  2. 它为对象返回NO。

  3. 此对象的映射是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;
    }