0

将内容推送到核心数据数据库后,我需要立即更新表格视图。

对于这个 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];
}

我已经被这个问题困扰了好几天。请帮助。在此先感谢您的解决方案。

4

1 回答 1

0

听起来您正在主线程中运行第一段代码。由于此线程还控制 UI 更新,因此在您的循环完成之前不会发生任何事情。有三种方法可以解决这个问题。

1) 从第二个线程更新 coredata 并向主线程传递一条消息,告诉它更新 UI。这非常棘手 - 查看核心数据多线程文档以获取一些可怕的警告!

2)不要在 for 循环中进行更新,而是将它们作为计时器的一部分。这将使用户界面有时间在每个插入之间进行更新,即

    ...
    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)更改您的应用程序,以便在填充核心数据时显示带有活动指示器的“请稍候”消息!这更容易做到,但如果您的更新需要很长时间,这可能会让用户望而却步。

于 2010-05-12T10:12:47.460 回答