How to force NSArrayController to reload MOC conte

2019-07-17 20:16发布

问题:

I am working on a Mac & iOS App, with iCloud CoreData in between to synchronize the data.

When I update some thing from iOS App, and the updates are already migrated to the PersistentStore in Mac App while the Mac App is running. The problem is I cannot find an effective way to force the NSArrayController to reload all data from the store.

tried -(void) fetch:(id)sender; only can see the delete or added entity, but the updated model property not refreshed...

Please help. Thanks

回答1:

If you see the latest data in the managed object context, but not in the array controller, you want:

[_yourManagedObjectContext processPendingChanges];
[_yourArrayController fetchWithRequest:nil merge:YES error:&error];
[_yourArrayController rearrangeObjects];

I use this in a Mac/iOS iCloud app to update the Mac app's data when the iCloud store changes.



回答2:

Following is the reply from Apple's Developer Technical support. It worked for me. Thanks all for providing solutions.

For the OS X app, when reloadFetchResults is called, you can ask the NSManagedObjectContext to reset itself and perform the fetch again.

- (void)reloadFetchedResults:(NSNotification *)note
{
NSDictionary *userInfoDict = [note userInfo];

NSManagedObjectContext *moc = self.coreDataController.mainThreadContext;

// this only works if you used NSMainQueueConcurrencyType
// otherwise use a dispatch_async back to the main thread yourself
//
[moc performBlock:^{
    [self mergeiCloudChanges:userInfoDict forContext:moc];

    [moc reset];
    [self.tableArrayController fetch:self];
}];
}


回答3:

I've found that

[self.managedObjectContext reset];
[myArrayController fetch:self];

forces my NSTableView (with NSArrayController) to re-populate and display newly processed NSManagedObjects.



回答4:

in case someone else finds this... in my case, I was building the array from user interaction (not Core Data), and then trying to show the tableView when they were done (on the same window)... and of course... seeing nothing!

[arrayController rearrangeObjects];

just before I wanted to show the tableView fixed it for me.