Execute NSFetchRequest on application startup
In another question ( Accessing an NSApplications delegate in another class? ) I asked about calling the Application's delegate because I needed it's managedObjectContext for a fetch request. However, when I try 开发者_开发知识库to let all values be displayed in an NSTableView on application startup, I'm running into problems. DataController, my NSTableViewDataSource, calls it's init-method before my application delegate calls it's applicationWillFinishStartup or any other method to initialize the managedObjectContext. What am I doing wrong? How else can I fill an NSTableView with already existing objects?
You should access managedObjectContext
only via its getter, even from DataController
, as in [appDelegate managedObjectContext]
or appDelegate.managedObjectContext
.
Your managedObjectContext
method should automatically set up the managed object context; you shouldn't write an explicit moc setup routines in your applicationDidFinishLaunching
, etc. And the standard core-data template is written that way.
Now, for this to work, the app delegate needs to be properly set up from the point of view of DataController
. However, init
is called before all the IBOutlet
is set up, so that's the wrong place to perform setup operations of objects inside the nib. Instead, use awakeFromNib
to do these things. awakeFromNib
is sent to every object after the IBOutlet
etc. are all set up.
That said, writing your own DataController
is a total waste of time. Just instantiate the standard NSArrayController
in the nib file, and use it in the Core Data mode via binding. There's absolutely no need for you to write the fetch request by yourself. Study Apple's own CoreData sample codes and then google "Binding CoreData Tutorial" for many tutorials available on-line.
精彩评论