How to force NSArrayController to reload MOC contents to reflect latest fresh data

旧街凉风 提交于 2019-12-11 02:18:25

问题


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.



来源:https://stackoverflow.com/questions/14049027/how-to-force-nsarraycontroller-to-reload-moc-contents-to-reflect-latest-fresh-da

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!