0

我有以下问题。

我正在编写一个使用 CoreData 和 Apple Recipes 示例作为指南的 RSS 阅读器。我有一个刷新按钮,可以重新下载 RSS 并使用 NSFetchRequest 验证是否有新数据。完成对元素的检查后,我通过 NSManagedObjectContext 保存方法提交更改。

上下文保存后,tableView 消失了!

然后我决定在 tableView 上调用 reloadData 以反映更改。所以,一旦 NSManagedObjectContext 被保存,我调用:

[self performSelectorOnMainThread:@selector(updateTableItems) withObject:nil waitUntilDone:NO];

-(void) updateTableItems {
    [self.tableView reloadData];
}

此操作导致单元格在滚动时删除数据,当我弹出视图并返回时,我看到所有更改并且一切正常。

我还阅读了我应该使用 NSFetchedResultsController 的线程之一,并确保 UITableView 是委托,与前一个问题相同。

我究竟做错了什么 ?为什么我看不到更改的地方?为什么单元格的内容被删除?

谢谢!

4

2 回答 2

1

听起来您在不同的线程上使用了两个或更多上下文。您在后台线程上下文中提交保存,但不要将更改与连接到前端线程上的 UI 的上下文合并。这会导致 UI 上下文与商店不同步,从而导致滚动时表格行消失。

当您通过离开视图弹出控制器时,上下文将被释放,这样当您第二次返回视图时,您将拥有一个新的上下文,以了解对存储的更改。

为防止出现此问题,请refreshObject:mergeChanges:在保存后台上下文后立即调用前台上下文。让前台上下文NSManagedObjectContextDidSaveNotification从后台上下文注册

于 2011-02-24T22:04:00.077 回答
0

我一直有一个类似的问题,它让我发疯。基本上在我的代码中,有很多竞争线程试图同时更新相同的数据(表视图后面的数据),我认为这会导致 UITableView “爆炸”并且其委托方法停止触发。(您可以通过将 NSLog 添加到委托方法中来证明这一点)。

它完全随机发生,并且很难复制。

我尝试了各种方法来解决这个问题,但唯一似乎可靠地确保它不会发生的事情是每次数据更改如下时完全重新创建我的 UITableView。(所以基本上在你调用 [self.tableView reloadData] 的地方改变以下内容)

// The UITableView may in rare circumstances all of a sudden failed to render 
// correctly. We're not entirely sure why this happens but its something to 
// do with multiple threads executing and updating the data behind the view 
// which somehow causes the events to stop firing.  Resetting the delegate and 
// dataSource to self isn't enough to fix things however so we have to 
// completely recreate the UITableView and replace the existing one.

UITableView* tempTableView = [[[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 387)] autorelease];
tempTableView.separatorColor = [UIColor grayColor];
tempTableView.backgroundColor = [UIColor clearColor];

if (self.tableView != nil)
{
    [tempTableView setContentOffset:self.tableView.contentOffset animated:NO];
}

tempTableView.delegate = self;
tempTableView.dataSource = self;
[tempTableView reloadData];  

 if (self.tableView != nil) {
     [self.tableView removeFromSuperview];
     self.tableView = nil;
 }

 [self.view addSubview:tempTableView];
 self.tableView = tempTableView;

我知道这不是理想的解决方法,也没有真正解释问题,但我认为这是一个 iOS 错误。但是,欢迎任何其他输入。

于 2012-02-23T17:58:55.973 回答