RestKit 映射结果已填充,但未设置核心数据实体

Posted

技术标签:

【中文标题】RestKit 映射结果已填充,但未设置核心数据实体【英文标题】:RestKit mapping result populated, but not setting Core Data entity 【发布时间】:2013-12-11 15:46:13 【问题描述】:

我正在尝试进行多部分 POST 以创建带有附加图像的新用户。 RKMappingResult 表明它成功映射了响应,但由于某种原因,它没有正确映射到 User 实体对象,因为映射后所有这些属性仍然是 nil

RKMapping结果:

(lldb) po mappingResult
<RKMappingResult: 0xc8d04a0, results=
    user = "<User: 0xc8d4360> (entity: User; id: 0xc676560 <x-coredata://68DA437E-D836-48F7-B4CE-CC08EC38B98F/User/p15> ; data: \n    accessToken = c81453227a39e16e396218d3a1ef0d80;\n    actions = nil;\n    createdAt = \"2013-12-11 15:34:45 +0000\";\n  email = \"user@users.com\";\n    firstName = Some;\n    fullName = \"Some User\";\n    lastName = User;\n    timezone = nil;\n    updatedAt = \"2013-12-11 15:34:45 +0000\";\n    username = nil;\n    uuid = \"de565267-eaf9-4cbf-a63e-44dd7df405aa\";\n)";
>

核心数据User实体(映射后):

(lldb) po newUser
<User: 0xc8ac300> (entity: User; id: 0xc8c5050 <x-coredata:///User/t1251A6D9-8FB8-4AF2-AFA4-ADB61F39397F2> ; data: 
    accessToken = nil;
    actions = nil;
    createdAt = nil;
    email = nil;
    firstName = nil;
    fullName = "(null) (null)";
    lastName = nil;
    timezone = nil;
    updatedAt = nil;
    username = nil;
    uuid = nil;
)

代码:

User *newUser = [User createNewUser];
NSDictionary *userParams = @kJsonUser : params;

NSURLRequest *request = [[APIClient objectManager] multipartFormRequestWithObject:newUser method:RKRequestMethodPOST path:kEndPointCreateListUsers parameters:userParams constructingBodyWithBlock:^(id<AFMultipartFormData> formData) 
    UIImage *image = [params objectForKey:kJsonImage];
    if (image) 
      [formData appendPartWithFileData:UIImageJPEGRepresentation(image, 1.0)
                                name:@"user_image"
                            fileName:@"user_image.jpeg"
                            mimeType:@"image/jpeg"];
    
];
RKManagedObjectRequestOperation *operation = [[APIClient objectManager] managedObjectRequestOperationWithRequest:request managedObjectContext:[APIClient mainThreadContext] success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) 
    [self handleSignUpSuccessForUser:newUser];
    success([newUser uuid]);
 failure:^(RKObjectRequestOperation *operation, NSError *error) 
    [self handleSignUpFailure];
    failure([error localizedDescription]);
];
[[APIClient objectManager] enqueueObjectRequestOperation:operation];

我注意到的一件事是映射结果中User 的内存地址与newUser 对象不同。如果我使用普通(非多部分)请求,那么它会很好地映射并设置 Core Data 对象。

非常感谢您提供的任何帮助!

【问题讨论】:

【参考方案1】: 来自映射结果:&lt;User: 0xc8d4360&gt; 来自您的调试日志:&lt;User: 0xc8ac300&gt;

所以你正在比较/记录不同的对象。

您创建 POST 请求的方式意味着您应该在发出请求后销毁newUser,并取而代之的是在映射请求中提供给您的User 对象。

如果您使用的是RKObjectManager,那么它会为您更新newUser,但您无法选择将图像数据添加到POST。目前newUser仅用于生成request,不可用于响应的映射。

【讨论】:

感谢您的快速回复!有没有更好的方法来创建请求,以便我使用的RKObjectManager(存储在[APIClient objectManager])将更新newUser,而不是我必须删除它并使用映射结果? 我不这么认为——只是因为你正在发送图像数据。如果没有发送图像,那么是的。 酷,谢谢你的帮助!我不再传入一个对象,然后我现在使用User *newUser = [mappingResult firstObject]; 来获取新创建的用户。

以上是关于RestKit 映射结果已填充,但未设置核心数据实体的主要内容,如果未能解决你的问题,请参考以下文章

将输出映射到 Restkit 中的核心数据时崩溃

Restkit嵌套对象映射问题

restkit:映射 to_many 与核心数据的关系

RestKit 和核心数据整数数组

使用 RestKIt 在核心数据实体中映射 json 对象

使用 managedObjectCache 时的 Restkit 映射