Restkit + Objective-c - 对同一Web服务的多次调用

时间:2013-03-18 13:41:45

标签: ios objective-c restkit

我是restkit和iOS的新手。我正在使用xcode 4.2和RestKit 0.2。我一直在开发一个iPhone应用程序,它与我创建的一些REST Web服务进行通信,现在我遇到了问题。 我的一些网络服务不止一次是打电话。第一个请求运行没有问题但是当我尝试再次进行调用时,我收到此错误:

  

'NSInternalInconsistencyException',原因:'无法为与现有请求描述符相同的对象类添加请求描述符。

我确实理解这个错误意味着什么但是还没有找到实现可以重用的调用的方法。我有一种感觉,我做错了。以下是我用来调用Web服务的功能之一:

- (void) restAddPlayer:(addPlayer*)add block:(void (^)(id))block{
// Load the object model via RestKit
RKObjectManager *objectManager = [RKObjectManager sharedManager];
RKObjectMapping *categoryRequestMapping = [RKObjectMapping requestMapping];
[categoryRequestMapping addAttributeMappingsFromDictionary:@{@"gName": @"groupName",@"pass":@"pass"}];

RKObjectMapping *reqMapping = [RKObjectMapping requestMapping];
[reqMapping addAttributeMappingsFromDictionary:@{@"plName": @"playerName"}];
[reqMapping addRelationshipMappingWithSourceKeyPath:@"groupInfo" mapping:categoryRequestMapping];
RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:reqMapping objectClass:[addPlayer class] rootKeyPath:nil];

[objectManager addRequestDescriptor:requestDescriptor];
objectManager.requestSerializationMIMEType = RKMIMETypeJSON;

[objectManager postObject:add path:@"addPlayer"parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {

                      NSArray* statuses = [mappingResult array];
                     //NSLog(@"Loaded statuses: %@", statuses);
                     // _result = [statuses objectAtIndex:0];
                      block(statuses);

                  }
                 failure:^(RKObjectRequestOperation *operation, NSError *error){
                     NSLog(@"Hit error: %@", error);
                     block(nil);
                 }
    ];
}

我知道我正在添加一个请求描述符,当我再次调用该函数时,它试图添加另一个因此错误。我想知道的是如何处理这个问题,以便我可以在发布的对象中使用不同的信息多次调用Web服务。

提前感谢所有人。

问候

1 个答案:

答案 0 :(得分:0)

除了“postObject”调用之外,此例程中的所有内容都应该位于其他位置,例如应用程序启动时的app-delegate。

您正在设置映射,关系和请求描述符。您无需为每个呼叫指定它们。只需设置一次,然后当你准备好时,只需调用“postObject”即可。同样可能也适用于你的serializationType - 除非一些REST端点返回XML而其他端点返回JSON,你可能只需设置一次,然后忘掉它。