设置params时,Restkit sendObject不发布对象

时间:2012-09-04 09:42:04

标签: iphone objective-c ios restkit

我正在尝试使用Restkit发布一个对象,但是当我设置一些额外的参数时,它不再发布该对象了。

NSDictionary *params = [NSDictionary dictionaryWithObject:@"mic" forKey:@"type"];

    [[RKObjectManager sharedManager] sendObject:rating toResourcePath:@"/mic" usingBlock:^(RKObjectLoader *loader) {
        loader.delegate = self;
        loader.method = RKRequestMethodPOST;
        loader.params = params; // without this line, the 'rating' object is posted, 
    }];

我需要发送不包含在对象中的额外POST参数,使用上面的代码,我通过POST接收额外的“type”参数,但是没有收到对象。

我阅读了文档https://github.com/RestKit/RestKit/wiki/Object-mapping的参数部分 - 由于方法已经改变,文档必须有点旧,但概念是相同的。我不明白我做错了什么......非常感谢帮助。

2 个答案:

答案 0 :(得分:3)

搜索RestKit的“prepareURLRequest”来源

第一行是:

    if ((self.sourceObject && self.params == nil) && (self.method == RKRequestMethodPOST || self.method == RKRequestMethodPUT))

所以,你的sourceObject是有效的,但你的params不是nil,所以你的对象永远不会被序列化。

此外,当您的对象成功序列化后,它将被置于“params”值中。所以,如果你说“loader.params = params”,你就会覆盖你的初始对象。

这里的最佳解决方案是更改“sourceObject”,使其中包含额外的参数,并相应地为其创建映射。

除此之外,您可能必须使用更通用的方法(查看loadObject),并在块中将方法更改为“POST”并手动更改构建后数据块。

答案 1 :(得分:1)

我找到了解决方案,它有点长,因为在使用sendObjectloadObject时,遗憾的是,该方法假定您将返回与您发送的对象相同的对象。这不是我的情况,因为它将返回相同的对象...或错误对象。所以我就这样做了

RKObjectManager *manager = [RKObjectManager sharedManager];
    [manager loadObjectsAtResourcePath:@"/mic" usingBlock:^(RKObjectLoader *loader) {
        loader.delegate = self;
        loader.method = RKRequestMethodPOST;
        NSError* error;
        RKObjectMapping* serializationMapping = [manager.mappingProvider serializationMappingForClass:[Rating class]];
        RKObjectSerializer* serializer = [RKObjectSerializer serializerWithObject:rating mapping:serializationMapping];
        id params = [serializer serializationForMIMEType:manager.serializationMIMEType error:&error];

        if (error) {
            NSLog(@"Error serializing object");
        }

        NSLog(@"Params class: %@", [params class]);

        if ([params respondsToSelector:@selector(setValue:forKey:)])
            [params performSelector:@selector(setValue:forKey:) withObject:@"mic" withObject:@"type"];

        loader.params = params;
    }];

我在块中序列化了对象,然后在结果字典中添加了一个参数。这样,我不必给对象一个额外的“类型”属性......这意味着我必须将它添加到我计划发布的每个对象上。