views:

21

answers:

1

I have a managed Object Model that contains 2 Entities.

One of the entities (Lets Call it EA) calculates it's properties by referencing some properties in a sub-set of the second entity (Call it EB).

Within EA I have set up a "Fetched Property" with a predicate that returns the subset of EB objects that I need.

When I Delete, Insert an EB object or change an EB Object I use notifications to ensure that EA is kept up to date. So for example after a "save" the EA object will recalculate it's properties.

My problem is that when I access the Fetched Property (Which I do within the EB model class using [self valueForKey:FetchedPropertyKeyName]), It appears only to extract the cached version. In other words the first time is fine, but when I add another EA object I am not seeing it in the returned array when I access the fetched property. This is most obvious when I delete an object, as then I get a crash due to the fact that this object no longer exists.

The documentation for Fetched Properties says:

If objects in the destination entity are changed, you must reevaluate the fetched property to ensure it is up-to-date. You use refreshObject:mergeChanges: to manually refresh the properties—this causes the fetch request associated with this property to be executed again when the object fault is next fired.

Sorry if it sounds a dumb question but unfortunately I'm not seeing where I should call refreshObject:mergeChanges: ??

+1  A: 

The discipline of writing the question made me look closely at the code again so I now have a solution!

I added:

[[self managedObjectContext] refreshObject:self mergeChanges:YES];

Into the Observing methods. This causes a fetch to occur, and it's in the awakeFromFetch method that I re-evaluate all my properties and the fetched property now contains the new data as expected.

Simon Booth
Its too bad you beat me too it! Please mark it as answered.
Peter DeWeese