Ios RestKit postObject方法中的post对象与它返回的RKMappingResult之间的关系是什么?
我已经阅读了RestKit上的文档,但还没有找到Ios RestKit postObject方法中的post对象与它返回的RKMappingResult之间的关系是什么?,ios,core-data,restkit,nsmanagedobject,restkit-0.20,Ios,Core Data,Restkit,Nsmanagedobject,Restkit 0.20,我已经阅读了RestKit上的文档,但还没有找到RKMappingResult上的一些细节 我的代码创建了一个名为newUser的NSManagedObject,并在RestKit-RKManagedObjectStore的mainQueueManagedObjectContext中插入。然后,我使用对象管理器的postObject:path:parameters:success:failure:方法将用户发布到服务器。这似乎效果不错 当post请求完成时,我需要更新newUser托管对象上的一
RKMappingResult
上的一些细节
我的代码创建了一个名为newUser
的NSManagedObject
,并在RestKit-RKManagedObjectStore的mainQueueManagedObjectContext
中插入。然后,我使用对象管理器的postObject:path:parameters:success:failure:
方法将用户发布到服务器。这似乎效果不错
当post请求完成时,我需要更新newUser
托管对象上的一些字段,这些字段不会从post请求的结果映射。传递到块中的mappingResult
参数似乎具有托管对象,该对象与服务器响应中设置的所有字段正确映射
显然,mappingResult
中的对象与我发布的对象不同,因为它们不在同一个线程中。如果在发布前保存newUser
,当请求完成并返回映射结果时,它们的objectID
是否相同
我想象newUser
和映射结果中的对象都指向存储在CoreData中的同一个对象,对吗?我问的原因是,情况似乎并非如此。如果我发出一个post请求并保存newUser
对象和mappingResult
中返回的对象,那么我在核心数据中会得到两个不同的对象,一个用于newUser
,另一个用于映射结果。我通过更改mappingResult对象和newUser
对象上的一个字段来确认这一点,并看到它们都是独立更改的。此外,在下一次提取时提取两个用户对象。我如何防止这种情况
但是,如果这是正确的,如果请求尚未完成,我崩溃会发生什么?我不会在CoreData中有一个存根对象吗
如果请求失败,如何删除我创建的存根对象?在故障块中,我可以执行以下操作吗
dispatch_async(dispatch_get_main_queue(), ^{
[newUser.managedObjectContext deleteObject:newRegisteredUser];
});
其中,newUser
,是我在mainQueue上创建的托管对象
最后,如果我通过映射结果返回后台线程中的托管对象,我不能将returnedUser设置为UI用于获取信息的用户,因为该用户位于主线程上,那么如何通知UI更改其用户?我是否应该发布通知,告知UI从核心数据中重新提取活动用户
关于重复对象的更新
我已经做了一些进一步的测试,当post返回时,我肯定会得到一个重复的对象
我首先创建一个newUser
,并在其上设置属性:
HNGRRegisteredUser *newUser = [NSEntityDescription insertNewObjectForEntityForName:@"RegisteredUser" inManagedObjectContext:context];
newUser.firstName = @"John"
newUser.lastName = @"Smith"
newUser.gender = @"Male"
newUser.email = @"js@email.com"
newUser.hungrosityModel = //fill in all of the attributes for a hungrosityModel, except uniqueID
此时,newUser.uniqueID==nil。然后保存newUser(我假设必须这样做,RestKit才能使用永久objectID)以生成存根对象
NSError *saveError;
[newRegisteredUser.managedObjectContext saveToPersistentStore:&saveError];
if (saveError) NSLog(@"Save Error: %@", saveError);
NSLog(@"newUser objectID: %@", [newRegisteredUser.objectID URIRepresentation]);
然后我发布newUser
对象
[[RKObjectManager sharedManager] postObject:newRegisteredUser path:@"users/" parameters:nil success:^(RKObjectRequestOperation *operation, RKMappingResult *mappingResult) {
NSError *saveError;
HNGRRegisteredUser *returnedUser = [mappingResult firstObject];
NSLog(@"mappingResult objectID: %@", [returnedUser.objectID URIRepresentation]);
[returnedUser.managedObjectContext saveToPersistentStore:&saveError];
if (saveError) NSLog(@"Error saving user upon registration: %@", saveError);
} failure:^(RKObjectRequestOperation *operation, NSError *error) {
[newUser.managedObjectContext deleteObject:newUser];
}];
ObjectId的打印输出如下所示
newUser objectID: x-coredata://B74AB613-1060-4D98-ABFC-3B4D89AB12C3/RegisteredUser/p2
mappingResult objectID: x-coredata://B74AB613-1060-4D98-ABFC-3B4D89AB12C3/RegisteredUser/p3
发送到服务器的JSON为:
{
"gender":"Male",
"lastName":"Smith",
"firstName":"John",
"email":"js@email.com",
"hungrosityModel": {
"totalNumberOfUpdates":0,
"peakHungrosity":0.8,
"hungrosityFractionAtLastUpdate":0,
"rateOfHungrosification":5e-05,
"troughHungrosity":0.1,
"peakUpdates":0
}
}
{"results": [
{"receivedFriendRequests": [],
"firstName": "John",
"middleName": null,
"hungrosityModel": {"uniqueID": 13},
"email": "js@email.com",
"gender": "Male",
"lastName": "Smith",
"sentFriendRequests": [],
"uniqueID": 14,
"updatedAt": "2014-03-12T17:45:01.973Z",
"friends": [],
"profileImageUpdatedAt": null,
"createdAt": "2014-03-12T17:45:01.809Z"}
]}
从服务器返回的JSON为:
{
"gender":"Male",
"lastName":"Smith",
"firstName":"John",
"email":"js@email.com",
"hungrosityModel": {
"totalNumberOfUpdates":0,
"peakHungrosity":0.8,
"hungrosityFractionAtLastUpdate":0,
"rateOfHungrosification":5e-05,
"troughHungrosity":0.1,
"peakUpdates":0
}
}
{"results": [
{"receivedFriendRequests": [],
"firstName": "John",
"middleName": null,
"hungrosityModel": {"uniqueID": 13},
"email": "js@email.com",
"gender": "Male",
"lastName": "Smith",
"sentFriendRequests": [],
"uniqueID": 14,
"updatedAt": "2014-03-12T17:45:01.973Z",
"friends": [],
"profileImageUpdatedAt": null,
"createdAt": "2014-03-12T17:45:01.809Z"}
]}
对象的响应和请求描述符为:
[[RKObjectManager sharedManager].router.routeSet addRoute:[RKRoute routeWithClass:[HNGRRegisteredUser class] pathPattern:@"users/" method:RKRequestMethodPOST]];
RKResponseDescriptor *registrationResponseDescriptor = [RKResponseDescriptor responseDescriptorWithMapping:[HNGRRKMappingProvider registeredUserMapping] method:RKRequestMethodPOST pathPattern:@"users/" keyPath:@"results" statusCodes:RKStatusCodeIndexSetForClass(RKStatusCodeClassSuccessful)];
[[RKObjectManager sharedManager] addResponseDescriptor: registrationResponseDescriptor];
RKRequestDescriptor *registrationRequestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:[[HNGRRKMappingProvider registeredUserMapping] inverseMapping] objectClass:[HNGRRegisteredUser class] rootKeyPath:nil method:RKRequestMethodPOST];
[[RKObjectManager sharedManager] addRequestDescriptor:registrationRequestDescriptor];
用户的映射为:
RKEntityMapping *_mapping = nil;
_mapping = [RKEntityMapping mappingForEntityForName:@"RegisteredUser" inManagedObjectStore:[RKManagedObjectStore defaultStore]];
[_mapping addAttributeMappingsFromArray:@[@"uniqueID",
@"createdAt",
@"updatedAt",
@"firstName",
@"middleName",
@"lastName",
@"email",
@"gender",
@"profileImageUpdatedAt"]];
[_mapping addRelationshipMappingWithSourceKeyPath:@"hungrosityModel" mapping:[HNGRRKMappingProvider basicModelMapping]];
_mapping.identificationAttributes = @[@"uniqueID"];
以下是相关的对象映射跟踪:
D restkit.object_mapping:RKMapperOperation.m:377 Executing mapping operation for representation: {
results = (
{
createdAt = "2014-03-12T18:22:35.688Z";
dateOfBirth = "2014-03-12T18:24:02Z";
firstName = John;
friends = (
);
gender = Male;
hungrosityModel = {
uniqueID = 14;
};
lastName = Smith;
middleName = "<null>";
profileImageUpdatedAt = "<null>";
receivedFriendRequests = (
);
sentFriendRequests = (
);
uniqueID = 14;
updatedAt = "2014-03-12T18:22:35.856Z";
}
);
}
and targetObject: <HNGRRegisteredUser: 0xaa8c180> (entity: RegisteredUser; id: 0xa894550 <x-coredata://44B8DF7A-BDC9-45F2-A137-BFAACF4AAF88/RegisteredUser/p2> ; data: {
createdAt = nil;
dateOfBirth = "2014-03-12 18:24:02 +0000";
email = "js@email.com";
firstName = John;
friendRequests = "<relationship fault: 0xa899dd0 'friendRequests'>";
friends = "<relationship fault: 0xa891ea0 'friends'>";
gender = Male;
hungrosityModel = "0xa861980 <x-coredata://44B8DF7A-BDC9-45F2-A137-BFAACF4AAF88/BasicModel/p2>";
hungrosityUpdateEvents = "<relationship fault: 0xa829d90 'hungrosityUpdateEvents'>";
isLocalUser = 0;
lastName = Smith;
middleName = nil;
myInvitations = nil;
profileImageData = nil;
profileImageThumbnailData = nil;
profileImageUpdatedAt = nil;
receivedInvitations = nil;
registeredUserSettings = nil;
savedHungrosityComments = "<relationship fault: 0xa8bc450 'savedHungrosityComments'>";
uniqueID = nil;
updatedAt = nil;
user = nil;
userSettings = nil;
})
T restkit.object_mapping:RKMapperOperation.m:320 Examining keyPath 'results' for mappable content...
D restkit.object_mapping:RKMapperOperation.m:297 Found mappable collection at keyPath 'results': (
{
createdAt = "2014-03-12T18:22:35.688Z";
dateOfBirth = "2014-03-12T18:24:02Z";
firstName = John;
friends = (
);
gender = Male;
hungrosityModel = {
uniqueID = 14;
};
lastName = Smith;
middleName = "<null>";
profileImageUpdatedAt = "<null>";
receivedFriendRequests = (
);
sentFriendRequests = (
);
uniqueID = 14;
updatedAt = "2014-03-12T18:22:35.856Z";
}
)
D restkit.object_mapping:RKMappingOperation.m:952 Starting mapping operation...
T restkit.object_mapping:RKMappingOperation.m:953 Performing mapping operation: <RKMappingOperation 0xa8e4440> for 'HNGRRegisteredUser' object. Mapping values from object {
createdAt = "2014-03-12T18:22:35.688Z";
dateOfBirth = "2014-03-12T18:24:02Z";
firstName = John;
friends = (
);
gender = Male;
hungrosityModel = {
uniqueID = 14;
};
lastName = Smith;
middleName = "<null>";
profileImageUpdatedAt = "<null>";
receivedFriendRequests = (
);
sentFriendRequests = (
);
uniqueID = 14;
updatedAt = "2014-03-12T18:22:35.856Z";
} to object <HNGRRegisteredUser: 0xa8833b0> (entity: RegisteredUser; id: 0xa8777e0 <x-coredata:///RegisteredUser/t1FD3D8DE-75AD-4194-B157-EB6931B74BDB6> ; data: {
createdAt = nil;
dateOfBirth = nil;
email = nil;
firstName = nil;
friendRequests = (
);
friends = (
);
gender = nil;
hungrosityModel = nil;
hungrosityUpdateEvents = (
);
isLocalUser = 0;
lastName = nil;
middleName = nil;
myInvitations = nil;
profileImageData = nil;
profileImageThumbnailData = nil;
profileImageUpdatedAt = nil;
receivedInvitations = nil;
registeredUserSettings = nil;
savedHungrosityComments = (
);
uniqueID = 14;
updatedAt = nil;
user = nil;
userSettings = nil;
}) with object mapping (null)
D restkit.object_映射:RKMapperOperation.m:377执行表示的映射操作:{
结果=(
{
createdAt=“2014-03-12T18:22:35.688Z”;
出生日期=“2014-03-12T18:24:02Z”;
名字=约翰;
朋友=(
);
性别=男性;
hungrosityModel={
uniqueID=14;
};
姓氏=史密斯;
middleName=“”;
profileImageUpdatedAt=“”;
已接收的朋友请求=(
);
sentFriendRequests=(
);
uniqueID=14;
updatedAt=“2014-03-12T18:22:35.856Z”;
}
);
}
和targetObject:(实体:RegisteredUser;id:0xa894550;数据:{
createdAt=nil;
出生日期=“2014-03-12 18:24:02+0000”;
电子邮件=”js@email.com";
名字=约翰;
friendRequests=“”;
“朋友”;
性别=男性;
hungrosityModel=“0xa861980”;
hungrosityUpdateEvents=“”;
isLocalUser=0;
姓氏=史密斯;
middleName=nil;
我的邀请=零;
profileImageData=nil;
profileImageThumbnailData=nil;
profileImageUpdatedAt=nil;
ReceivedVitations=零;
registeredUserSettings=nil;
savedHungrosityComments=“”;
uniqueID=nil;
updatedAt=nil;
用户=零;
userSettings=nil;
})
对象映射:RKMapperOperation.m:320正在检查可映射内容的键路径“结果”。。。
D restkit.object_mapping:rkmapperooperation.m:297在键路径“results”处找到可映射集合:(
{
createdAt=“2014-03-12T18:22:35.688Z”;
出生日期=“2014-03-12T18:24:02Z”;
名字=约翰;
朋友=(
);
性别=男性;
hungrosityModel={
uniqueID=14;
};
姓氏=史密斯;
middleName=“”;
profileImageUpdatedAt=“”;
已接收的朋友请求=(
);
sentFriendRequests=(
);
uniqueID=14;
updatedAt=“2014-03-12T18:22:35.856Z”;
}
)
D restkit。