我正在我的应用程序中处理数据导入部分,为了使 UI 更可靠,我关注了这篇 Marcus Zarra 文章 http://www.cimgf.com/2011/08/22/importing-and-displaying-large -核心数据中的数据集/
这个想法是您在后台踏板的单独上下文中进行导入(我为此使用 GCD),并且您的 fetchedResultsController 的上下文通过观察NSManagedObjectContextDidSaveNotification来合并更改。
我遇到的问题对我来说很奇怪——我的 fetchedResultsController 没有得到这些更改,并且在新数据到来时不会重新加载 TableView。但是,如果我触发以下方法,该方法会进行获取并重新加载表 - 它会全部获取。
- (void)updateUI
{
NSError *error;
if (![[self fetchedResultsController] performFetch:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
[self.tableView reloadData];
}
所以现在我在获得NSManagedObjectContextDidSaveNotification以使其工作时调用该方法,但它对我来说看起来很奇怪和讨厌。
- (void)contextChanged:(NSNotification*)notification
{
if ([notification object] == [self managedObjectContext]) return;
if (![NSThread isMainThread]) {
[self performSelectorOnMainThread:@selector(contextChanged:) withObject:notification waitUntilDone:NO];
return;
}
[[self managedObjectContext] mergeChangesFromContextDidSaveNotification:notification];
//TODO:Make it work as it should - merge, without updateUI
[self updateUI];//!!!Want to get rid of this!
}
为什么会这样?这是负责解析数据并添加观察者的代码。
- (void)parseWordsFromServer:(NSNotification *)notification
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0) , ^{
NSDictionary *listInJSON = [notification userInfo];
wordsNumbers = [[listInJSON valueForKey:@"words"]mutableCopy];
if ([wordsNumbers count])
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(contextChanged:) name:NSManagedObjectContextDidSaveNotification object:nil];
//新线程的新上下文 NSManagedObjectContext *backContext = [[AppDelegate sharedAppDelegate]backManagedObjectContext];
//Get all the words we already have on this device
NSArray *wordsWeHave = [Word wordsWithNumbers:wordsNumbers inManagedContext:backContext];
//Add them to this list
for (Word *word in wordsWeHave)
[[List listWithID:[currentList listID] inManagedObjectContext:backContext]addWordsObject:word];
[backContext save:nil];!//Save the context - get the notification
}
});
}
编辑
我NSFetchedResutsControllerDelegate
确实使用了,如果我没有,我怎么能假装我的表格视图被更新?
更新决定只是转移到父子范式