For example, given an Employee entity with a relationship to a Department entity, if you fetch all the employees, for each employee, print the employee’s name and the name of the department.You can avoid the possibility of a fault being fired for each department instance by prefetching the department relationship.
In a Cocoa application that leverages Cocoa bindings, given that Cocoa bindings are reliant upon key-value coding and key-value observing, it would be difficult to build a raw data storage mechanism that provides the same level of efficiency as Core Data.
Each round trip to the persistent store (each fetch) incurs an overhead, both in accessing the store and in merging the returned objects into the persistence stack.
You can reduce the memory overhead by refaulting individual managed objects that you no longer need, or you can reset a managed object context to clear an entire object graph.
You can also use patterns that apply to Cocoa programming in general.
These trips represent a considerable overhead on top of the minimum two trips to the persistent store.
There are two techniques you can use to mitigate this effect— Prefetching is in effect a special case of batch-faulting, performed immediately after another fetch.How you use predicates can significantly affect the performance of your application.If a fetch request requires a compound predicate, you can make the fetch more efficient by ensuring that the most restrictive predicate is the first, especially if the predicate involves text matching ( If you are using the SQLite store, you can use a fetch limit to minimize the working set of managed objects in memory and so improve the performance of your application.To avoid the inefficiency of individual faults firing, you can prefetch the objects at the destination.You can use the to specify an array of relationship key paths to prefetch along with the entity for the request.The idea behind prefetching is the anticipation of future needs.