ios - What is the relationship between the post object, in the RestKit postObject method, and the RKMappingResult it returns? -


i have been looking through documentation on restkit, haven't been able work out of specifics on rkmappingresult.

i have code creates nsmanagedobject, called newuser, , inserts in mainqueuemanagedobjectcontext of restkit rkmanagedobjectstore. use object manager's postobject:path:parameters:success:failure: method post user server. appears work fine.

i need update fields on newuser managed object when post request completes, not mapped result of post request. mappingresult parameter passed block seems have managed object mapped of fields set response of server.

obviously, object in mappingresult not same object 1 posted since not in same thread. if save newuser before post, objectid's same when request finishes , returns mapping result?

i imagining both newuser , object mapping result refer same object stored in coredata, correct? reason ask that, appears not case. if make 1 post request , save both newuser object , object returned in mappingresult, end 2 different objects in core data, 1 newuser , 1 mapping result. confirmed changing field on both mappingresult object , newuser object , seeing both changed independently. additionally, fetches 2 user objects next time fetch. how prevent this?

if, correct, happens if crash request has not yet completed? won't have stub object hanging around in coredata?

if request fails, how delete stub object created? following, in failure block?

        dispatch_async(dispatch_get_main_queue(), ^{             [newuser.managedobjectcontext deleteobject:newregistereduser];         }); 

where newuser, managed object created on mainqueue.

lastly, if managed object in background thread via mapping result can't set returneduser user ui using information since on main thread, how notify ui change it's user? should post notification tells ui refetch active user core data?

update regarding duplicate object

i have done further testing , getting duplicate object when post returns.

i first create newuser , set properties on it:

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 of attributes hungrositymodel, except uniqueid 

at point, newuser.uniqueid == nil. save newuser (which assuming have restkit can use permanent objectid), make stub object.

nserror *saveerror; [newregistereduser.managedobjectcontext savetopersistentstore:&saveerror]; if (saveerror) nslog(@"save error: %@", saveerror); nslog(@"newuser objectid: %@", [newregistereduser.objectid urirepresentation]); 

i post newuser object.

[[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]; }]; 

the print outs objectids below.

newuser objectid: x-coredata://b74ab613-1060-4d98-abfc-3b4d89ab12c3/registereduser/p2 mappingresult objectid: x-coredata://b74ab613-1060-4d98-abfc-3b4d89ab12c3/registereduser/p3 

the json sent server was:

{     "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     } } 

the json returned server was:

{"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"}  ]} 

the response , request descriptors object are:

[[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]; 

the mapping user is:

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"]; 

here relevant object mapping trace:

d restkit.object_mapping:rkmapperoperation.m:377 executing mapping operation 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";             }         );     }      , 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' mappable content...   d restkit.object_mapping:rkmapperoperation.m:297 found mappable collection @ 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> 'hngrregistereduser' object. mapping values 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"; } 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; }) object mapping (null) 

let me know if there more information helpful know.

yes, object id match (even if managed object instance different still represents same underlying entity instance). same managed object instance start on main thread , restkit calls on main thread too.

the new instance describe doesn't happen. original object post should updated directly. in case isn't happening because server returning array of objects. causing restkit ignore supplied destination object , create new ones. in case that's 1 new object because array contains 1 item. fix need modify json coming server can't index array part of mapping...

to delete, don't need switch thread (though can if want future proofing), , correct approach.

you can post notification. use fetched results controller manages observing changes you.


Comments

Popular posts from this blog

get url and add instance to a model with prefilled foreign key :django admin -

android - Keyboard hides my half of edit-text and button below it even in scroll view -

css - Make div keyboard-scrollable in jQuery Mobile? -