2011-02-24 41 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 。不過歡迎任何其他意見。

相關問題