2011-02-24 76 views
0

我遇到以下问题。保存调用NSManagedObjectContext使UITableView单元消失

我在写一个使用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是委托,与前一个相同的问题。

我在做什么错? 为什么我无法看到所做的更改? 为什么单元格的内容被删除?

谢谢!

+0

你的表格视图显示什么数据?它如何获取这些数据? – 2011-02-24 20:28:01

+0

细胞呈现RSS项目。所有单元格都是简单的单元格,其中包含项目标题中的文本,该项目是NSManagedObject,它在解析时被添加到实体中。 – djTeller 2011-02-24 20:29:12

+0

发布您的代码,以便我们可以为您提供帮助! @西蒙的问题是关于你的表数据源 - 它是一个项目的数组?您是否使用提取的结果控制器?发布你的tableview数据源方法和你的提取请求。 – Rog 2011-02-24 21:39:51

回答

0

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

当您通过离开视图来弹出控制器时,将取消分配上下文,以便当您第二次返回视图时,会有一个新的上下文意识到存储的更改。

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

+0

我实际上只运行一个线程。想想一个RSS刷新按钮,点击时我会显示一个“Please Wait”AlertView,在后台我再次下载RSS,解析它..验证是否有任何更改,如果有的话我添加它们。完成后,我保存上下文!这与我在我的观点之间传递的相同背景有关。我读了一篇关于使用线程核心数据的好文章,并且每个线程都应该有自己的上下文,然后将它们合并..但这不是这里的情况。当我点击保存,繁荣细胞的内容消失.. – djTeller 2011-02-25 19:04:59

+0

如果你不使用线程为什么要麻烦'performSelectorOnMainThread:'?你是不是从tableview控制器调用'reloadData'?在这一点上,如果它不是一个线程问题,我真的没有足够的信息来解决任何问题。表行被清空的唯一原因是如果'numberOfRowsInSection'返回0以使表相信它没有任何可显示的内容。 – TechZen 2011-02-25 22:12:50

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 。不过欢迎任何其他意见。

相关问题