RestKit 对象映射 POST 响应,“CoreData:错误:在 NSManagedObject 类映射操作上调用指定初始化程序失败”
Posted
技术标签:
【中文标题】RestKit 对象映射 POST 响应,“CoreData:错误:在 NSManagedObject 类映射操作上调用指定初始化程序失败”【英文标题】:RestKit object mapping POST response, "CoreData: error: Failed to call designated initializer on NSManagedObject class mapping operation" 【发布时间】:2014-01-08 23:35:35 【问题描述】:POST 请求的响应对象在尝试映射到对象时崩溃。打印以下输出“CoreData: error: Failed to call specified initializer on NSManagedObject class mapping operation”
正如消息所示,正在使用 RKObjectRequestOperation 而不是 RKManagedObjectRequestOperation。我的问题可能很复杂,因为外部对象是一个普通的 nsobject,但其中有一个包含 nsmanagedObject 实体的成员变量。我一直在研究代码,但我不确定如何将代码引导到我想要的方向。更糟糕的是,我能够映射到 GET 请求的响应对象。除了例外,响应对象基本相同。这是我正在使用的代码
我的响应对象是一个普通的 NSObject,里面有一个嵌套的托管对象。
// response definition
@interface PDResponse : NSObject
@property (nonatomic, strong) NSString *message;
@property (nonatomic, strong) NSNumber *success;
@property (nonatomic, strong) id value;
@property (nonatomic, strong) NSDictionary *exception;
@property (nonatomic, strong) NSString *transactionId;
@end
// Mapping for the download object
RKEntityMapping * repMapping = [RKEntityMapping mappingForEntityForName:@"PDRepresentative" inManagedObjectStore:managedObjectStore];
repMapping = @[@"repId"];
[repMapping addAttributeMappingsFromDictionary:@
@"RepId": @"repId",
@"First": @"firstName",
@"Middle": @"middleName",
@"Last": @"lastName",
@"Address1": @"address1",
@"Address2": @"address2",
@"City": @"city",
@"Zip": @"zip",
@"Country": @"country",
@"Company": @"company",
@"Phone": @"phone",
@"PhonePersonal": @"phonePersonal",
@"Fax": @"fax",
@"Email": @"email",
@"EventId": @"event.eventId",
@"Specialty": @"specialty"];
RKObjectMapping *responseMapping = [RKObjectMapping mappingForClass:[PDResponse class]];
[responseMapping addAttributeMappingsFromDictionary:@@"Message": @"message",
@"Success": @"success",
@"Ex": @"exception",
@"TransactionId": @"transactionId"];
[responseMapping addPropertyMapping:[RKRelationshipMapping relationshipMappingFromKeyPath:@"Value"
toKeyPath:@"value"
withMapping:repMapping]];
[objectManager addResponseDescriptor:[RKResponseDescriptor responseDescriptorWithMapping: responseMapping
method:RKRequestMethodPOST
pathPattern:@"PostAddOrUpdateRep/"
keyPath:nil
statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)]];
// POST Object
RKObjectManager *objectManager = [RKObjectManager sharedManager];
NSMutableURLRequest *request = [objectManager requestWithObject:self method:RKRequestMethodPOST path:@"PostAddOrUpdateRep/" parameters:nil];
RKObjectRequestOperation *operation = [objectManager objectRequestOperationWithRequest:request
success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult)
PDResponse *response = mappingResult.firstObject;
response = [response isKindOfClass:[PDResponse class]] ? response : nil;
TRACE_LOG(@"%@", response);
failure:^(RKObjectRequestOperation *operation, NSError *error)
ERROR_LOG(@"Failure int %s %@, %@", __PRETTY_FUNCTION__, operation, error);
];
[objectManager enqueueObjectRequestOperation:operation];
self.sent = @(YES);
我观察了许多其他帖子,并根据我从这些帖子中找到的信息做了以下事情。
由于描述符无法正确映射到路径的问题,在另一篇文章中建议删除和添加斜杠,但事实并非如此。我选择不使用 postObject:path:parameters:success:failure 函数,因为它在映射响应时出错,其中目标对象变量分配给类型为 PDRepresentative 而不是 PDResponse。
我也可以正常上传,所以我的 managedObjectStore 很好。如您所见,我正在使用 RKEntityMapping 对象,因此希望这会告诉代码使用 NSManagedObject 而不是 NSObject。
一位名叫 Wain 的用户在另一篇帖子中建议,将托管项目和非托管项目混在一起可能会造成潜在问题。我倾向于相信他,但我想解决这个问题,因为我确实让它对我的 GET 请求的响应起作用。
任何帮助将不胜感激,谢谢。
【问题讨论】:
【参考方案1】:我很愚蠢,只是将创建请求操作的函数更改为managedObjectRequestOperationWithRequest:managedObjectContext:success:fail
,而不是使用objectRequestOperationWithRequest:success:fail
。我只是阅读了我在问题的第一段中写的内容。
天哪,我是个白痴。
【讨论】:
以上是关于RestKit 对象映射 POST 响应,“CoreData:错误:在 NSManagedObject 类映射操作上调用指定初始化程序失败”的主要内容,如果未能解决你的问题,请参考以下文章
在其 HTTP 正文中嵌套 JSON 的 RestKit 对象映射请求