ios - RestKit addFetchRequestBlock causes objects not to be mapped -


i have following fetch request block set deal deletion of orphaned objects:

  [objectmanager addfetchrequestblock:^nsfetchrequest *(nsurl *url) {     rkpathmatcher *pathmatcher = [rkpathmatcher pathmatcherwithpattern:api_get_active_rides];      nsstring * relativepath = [url relativepath];     nsdictionary *argsdict = nil;     bool match = [pathmatcher matchespath:relativepath tokenizequerystrings:no parsedarguments:&argsdict];     if (match) {         nsfetchrequest *fetchrequest = [nsfetchrequest fetchrequestwithentityname:@"ride"];         return fetchrequest;     }      return nil; }]; 

since need allow users log out , log in, clear data core data using following:

 + (void) clearuserdata {     nserror * error = nil;     [[rkmanagedobjectstore defaultstore] resetpersistentstores:&error];     if(error != nil){         [wrutilities criticalerror:error];         return;     } } 

however, if log out , log app, objects loaded first time logged in not loaded server. using restkit logging, can see request goes out , returns correct data server, mapping appears skipped, causing no objects (re)inserted core data.

if remove fetch request block, works expect - clearuserdata removes data, , upload login data re-queried server , reloaded core data.

my question 2 fold. need change expected behavior of reloading data, , why fetch request block, understand deleting orphaned objects, have effect on scenario?

i've seen before , removed fetch request block, prefer use feature rather skip because of problem.

i had exact problem , managed find solution. code below return fetch request if there existing items held in coredata. problem returning time means restkit delete items server first time. idea here return nil if there no items held in coredata. not sure if way restkit recommend, worked me.

rkobjectmanager *sharedmanager = [rkobjectmanager sharedmanager]; [sharedmanager addfetchrequestblock:^nsfetchrequest *(nsurl *url) {     rkpathmatcher *userpathmatcher = [rkpathmatcher pathmatcherwithpattern:@"my/api/path"];     bool match = [userpathmatcher matchespath:[url relativepath] tokenizequerystrings:no parsedarguments:nil];     if(match) {         // lets first check if have in coredata         nsstring * const entityname = nsstringfromclass([mycoredataentity class]);         nsfetchrequest *fetchrequest = [nsfetchrequest fetchrequestwithentityname:entityname];         nserror *error = nil;         nsmanagedobjectcontext *managedobjectcontext = [rkmanagedobjectstore defaultstore].mainqueuemanagedobjectcontext;         nsarray *results = [managedobjectcontext executefetchrequest:fetchrequest error:&error];         if(error) {             // shouldn't happen, if went wrong querying coredata             // lets save new ones             nslog(@"error %@", error);             return nil;         }          if([results count] > 0) {             // if have saved, lets delete 'em , save              // new ones             return [nsfetchrequest fetchrequestwithentityname:entityname];         }         else {             // if don't have saved, lets save them             // (e.g. first time after login after cleared on logout)             return nil;         }     }     return nil; }]; 

hope helps!


Comments

Popular posts from this blog

javascript - Jquery show_hide, what to add in order to make the page scroll to the bottom of the hidden field once button is clicked -

javascript - Highcharts multi-color line -

javascript - Enter key does not work in search box -