我需要在核心数据库中推送内容后立即更新tableview。
为此 AppDelegate.m包含以下代码
NSManagedObjectContext *moc = [self managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"FeedItem" inManagedObjectContext:moc]];
//for loop
// push data in code data & then save context
[moc save:&error];
ZAssert(error == nil, @"Error saving context: %@", [error localizedDescription]);
//for loop ends
此代码触发RootviewController.m
中的以下代码- (void)controllerWillChangeContent:(NSFetchedResultsController*)controller
{
[[self tableView] beginUpdates];
}
但是这只在for循环结束时更新了tableview,在db中立即推送后表没有得到更新。
我尝试了以下代码但是没有用
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller {
// In the simplest, most efficient, case, reload the table view.
[self.tableView reloadData];
}
我已经坚持了几天这个问题。请帮助。谢谢你提前解决。
答案 0 :(得分:0)
听起来你正在主线程中运行第一段代码。由于此线程还控制UI更新,因此在循环完成之前不会发生任何事情。有三种方法可以解决这个问题。
1)从第二个线程更新coredata并将消息传递到主线程以告知它更新UI。这是非常棘手的 - 看看core data multithreading docs的一些可怕的警告!
2)不要在for循环中进行更新,而是将它们作为计时器的一部分。这将使ui有时间在每个插入之间进行更新,即
...
self.stuffToUpdate = [NSMutableArray arrayWithObjects:...];
[NSTimer scheduledTimerWithInterval:0.1 target:self selector:@selector(doStuff:) userInfo:nil repeats:YES];
...
- (void) doStuff:(NSTimer *)timer {
// If there's noting to update, bail
if (0 == stuffToUpdate.count) {
[timer invalidate];
return;
}
// Get the next object to update
id object = [stuffToUpdate objectAtIndex:stuffToUpdate.count-1];
[stuffToUpdate removeLastObject];
// Do stuff to object
[object doStuff];
// Save
NSError &error = nil;
[moc save:&error];
// Tell the table to update
[self.tableView reloadData];
}
然而,不断更新这样的表可能会给出奇怪的用户界面问题 - 您必须在用户测试中尝试它以查看它是否正常工作。此外,这将减慢更新coredata所需的总时间,但如果您一直在更新UI,则可能不会出现问题。
3)更改您的应用,以便在填充coredata时显示带有活动指示符的“请稍候”消息!这样做要容易得多,但如果您的更新需要很长时间,这可能会让用户失望。