gpt4 book ai didi

ios - RestKit RKObjectMapping 一个列表

转载 作者:行者123 更新时间:2023-12-01 17:54:11 24 4
gpt4 key购买 nike

我是 RestKit 的新手,正在尝试映射一个 json 对象,其中包含我的模型的对象数组。我已经调试并发现响应命中我的服务器-> json 返回-> RestKit 说映射成功并且我映射了 1 个对象...但是,errorCode 字段和业务数组(bList)是当我做 BusinessObjectModel *response = result.array.firstObject; 时都为空
在 OnSuccessBlock 中。

杰森:

 {
"bList":
[
{
"id": 1,
"name": "aName",
"owner": 1,
"category": 1,
}
{
"id": 2,
"name": "aName2",
"owner": 1,
"category": 1,
}
],
"errorCode": 0
}

想要将此 Json 映射到此 objective-c 对象:

BusinessObjectModel 对象映射 :
RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[BusinessObjectModel class]];
[responseMapping addAttributeMappingsFromDictionary:@{
@"id": @"business_id",
@"name": @"business_name",
}];


return responseMapping;

B型号:
  @interface bModel : NSObject
@property (nonatomic, copy) NSNumber *errorCode;
@property (nonatomic, copy) NSMutableArray *bList;
+(RKObjectMapping *) getMapping;
@end

BModel 对象映射:
RKObjectMapping *bMapping = [BusinessObjectModel getMapping];

RKObjectMapping *buslstMapping = [RKObjectMapping mappingForClass:[BModel class]];
[buslstMapping addAttributeMappingsFromDictionary:@{@"errorCode": @"errorCode"}];
// Define the relationship mapping
[buslstMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:nil
toKeyPath:nil
withMapping:bussinessMapping]];

return buslstMapping;

描述符如下所示:
 RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:ResponseMapping method:RKRequestMethodAny pathPattern:nil keyPath:@"bList" statusCodes:nil];

编辑

我想将上面的 Json 映射到:
  @interface bModel : NSObject
@property (nonatomic, copy) NSNumber *errorCode;
@property (nonatomic, copy) NSMutableArray *bList;
@end

其中 bList 是以下对象的数组:
      @interface Business : NSObject
@property (nonatomic, copy) NSNumber *id;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSNumber *id;
@property (nonatomic, copy) NSNumber *id;
@end

我想问题是我如何做嵌套关系(对于上述关系,响应描述符必须是什么)?

最佳答案

很高兴看到您使用 RestKit。您的第一个助手将是 RestKit 提供的日志记录。添加这行代码执行您的 AppDelegate 并观察控制台是否有错误。

// The * will send everything RestKit does to the console    
// Replace the * with the module you want to check (Network/CoreData/...)
RKLogConfigureByName("RestKit/*", RKLogLevelTrace);

在查看 JSON 时,您一方面希望从 keyPath“bList”中获取对象,另一方面在出现问题时获取错误代码或消息。 RestKit 提供了一个内置的错误处理来从你的 JSON 中获取这些信息。

为 RKErrorMessage 类初始化 RKObjectMapping 并使用正确的 keyPaths 将 RKResponseDescriptor 添加到您的请求中,包括状态代码的范围(这里使用客户端错误)。 RestKit 将自动检测错误代码(当在 header 中发送时)并应用映射来获取错误消息的内容。
// Init error mapping
RKObjectMapping *errorMapping = [RKObjectMapping mappingForClass:[RKErrorMessage class]];
[errorMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"errorMessage"]];

// Add mapping as response descriptor
RKResponseDescriptor *errorDescriptor =
[RKResponseDescriptor responseDescriptorWithMapping:errorMapping
method:RKRequestMethodGET
pathPattern:nil
keyPath:@"message" // Edit the keyPath to the value of your JSON (e.g. errorCode)
statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassClientError)];
[RKObjectManager.sharedManager addResponseDescriptor:errorDescriptor];

要在发生故障时获取错误消息,您只需获取消息对象即可。使用 block 获取对象时,可以使用给定 NSError 中的 userInfo 字典。
RKErrorMessage *errorMessage = [[error.userInfo objectForKey:RKObjectMapperErrorObjectsKey] firstObject];
NSLog(@"Error: %@", errorMessage);

现在您可以稍微简化您的对象模型并专注于映射 BusinessObjectModel。使用字典映射对象时,您需要检查本地属性是否与 JSON 中的值匹配。
RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[BusinessObjectModel class]];
[responseMapping addAttributeMappingsFromDictionary:@
{
@"value_from_remote_json": @"value_in_local_object", // e.g. @"id" : @"business_id"
...
}];
return responseMapping;

您不再需要使用 RKRelationshipMapping。重新配置您的对象/映射,然后重试。日志记录将向您显示提供的映射以及映射操作是否有效。最后一点,通过抛出 NSAssert 错误来确保映射在使用时位于内存中。
RKObjectMapping *bMapping = [BusinessObjectModel getMapping];
NSAssert(bMapping, @"bMapping mapping must not be nil");

编辑

要将没有 keyPath 的值(如“errorCode”字段)映射到对象的映射,您需要提供具有相应映射的对象。以 documentation 中的示例为例你会以类似的方式结束:
// Init object
@interface RKErrorCode : NSObject
@property (nonatomic) NSNumber *errorCode;
@end

// Init mapping
RKObjectMapping *codeMapping = [RKObjectMapping mappingForClass:[RKErrorCode class]];
[codeMapping addPropertyMapping:[RKAttributeMapping attributeMappingFromKeyPath:nil toKeyPath:@"errorCode"]];

// Add response descriptor for request
RKResponseDescriptor *responseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:codeMapping method:RKRequestMethodAny pathPattern:nil keyPath:@"errorCode" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[[RKObjectManager sharedManager] addResponseDescriptor:responseDescriptor];

关于ios - RestKit RKObjectMapping 一个列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21221090/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com