在核心数据iphone中推送数据时立即更新tableview

时间:2010-05-12 09:51:32

标签: iphone core-data tableview

我需要在核心数据库中推送内容后立即更新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];
}

我已经坚持了几天这个问题。请帮助。谢谢你提前解决。

1 个答案:

答案 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时显示带有活动指示符的“请稍候”消息!这样做要容易得多,但如果您的更新需要很长时间,这可能会让用户失望。