ios - AFIncrementalStore context vs MagicalRecord MR_contextForCurrentThread -
i trying use afincrementalstore magicalrecord.
i have class beer few properties (from brewerydb web service). fetch beers using [beer mr_fetchallwithdelegate:self] returns nsfetchedresultscontroller instance, (which grab , assign beerfetchcontroller) , performs actual fetch using controller. can see set view controller delegate of the method, in turns, sets view controller delegate of beerfetchcontroller. far good. have table view displays beers, , implement method
- (void)controllerdidchangecontent:(nsfetchedresultscontroller *)controller { [self.beerstable reloaddata]; }
so whenever afincrementalstore gets data, puts context, controller notified , in turn method should called, , table refreshed. problem is, delegate method not called @ all! after investigation able draw conclusions.
+ (nsfetchedresultscontroller *) mr_fetchallwithdelegate:(id<nsfetchedresultscontrollerdelegate>)delegate; { return [self mr_fetchallwithdelegate:delegate incontext:[nsmanagedobjectcontext mr_contextforcurrentthread]]; } + (nsfetchedresultscontroller *) mr_fetchallwithdelegate:(id<nsfetchedresultscontrollerdelegate>)delegate incontext:(nsmanagedobjectcontext *)context; { nsfetchrequest *request = [self mr_requestallincontext:context]; nsfetchedresultscontroller *controller = [self mr_fetchcontroller:request delegate:delegate usefilecache:no groupedby:nil incontext:context]; [self mr_performfetch:controller]; return controller; }
the issue that, [nsmanagedobjectcontext mr_contextforcurrentthread], return child context who's parent backing context afincrementalstore uses internally. afincrementalstore saves parent, not child, therefore controller has no idea changed, , delegate method not called. able modify method :
+ (nsfetchedresultscontroller *) mr_fetchallwithdelegate:(id<nsfetchedresultscontrollerdelegate>)delegate incontext:(nsmanagedobjectcontext *)context; { nsfetchrequest *request = [self mr_requestallincontext:context]; nsfetchedresultscontroller *controller = [self mr_fetchcontroller:request delegate:delegate usefilecache:no groupedby:nil incontext:context.parentcontext]; [self mr_performfetch:controller]; return controller; }
instead of binding controller context returned mr_contextfromcurrentthread, bind parent. , then, expected stuff works should, context changed, controller sees that, , delegate method called. question is, there way to, push changes parent context child context not have change method implementation ?
+ (nsmanagedobjectcontext *) mr_contextforcurrentthread; { if ([nsthread ismainthread]) { return [self mr_defaultcontext]; } else { nsmutabledictionary *threaddict = [[nsthread currentthread] threaddictionary]; nsmanagedobjectcontext *threadcontext = [threaddict objectforkey:kmagicalrecordmanagedobjectcontextkey]; if (threadcontext == nil) { threadcontext = [self mr_contextwithparent:[nsmanagedobjectcontext mr_defaultcontext]]; [threaddict setobject:threadcontext forkey:kmagicalrecordmanagedobjectcontextkey]; } return threadcontext; } }
Comments
Post a Comment