所以我几乎已经弄清楚了这一点,但是当我从搜索表格后输入的详细视图中更新我的managedObjectContext时,我在NSFetchedResultsChangeUpdate上遇到了绊脚石。
我有一个从核心数据集生成的tableview。我可以从此表中输入详细信息视图,并进行更改而不会出现任何问题。我也可以搜索表格,并且在没有任何问题的情况下进行大部分时间的更改。但是,在某些对象上,我得到“在Core Data更改处理期间捕获到异常”。
我将其跟踪到NSFetchedResultsChangeUpdate。我正在使用以下代码:
case NSFetchedResultsChangeUpdate:
if (searchTermForSegue)
{
NSLog(@"index info:%@.....",theIndexPath);
NSLog(@"crashing at the next line");
[self fetchedResultsController:self.searchFetchedResultsController configureCell:[tableView cellForRowAtIndexPath:theIndexPath] atIndexPath:theIndexPath];
break;
} else {
[self fetchedResultsController:controller configureCell:[tableView cellForRowAtIndexPath:theIndexPath] atIndexPath:theIndexPath]; }
break;
当没有搜索表时,它运行else方法,并且100%的时间都可以工作。在搜索表时,它会运行if(searchTermForSegue)并且大部分时间都可以运行,但并非总是如此。我记录了TheIndexPath并发现了以下内容:
当它工作时,theIndexPath正确报告对象indexPat,当它失败时,调用了错误的theIndexPath。例如,如果我进行搜索,将tableView缩小为3个部分,首先是2个项目,第二个是1个,第三个是1个,我得到以下nslog:
On first object: index info:<NSIndexPath 0xb0634d0> 2 indexes [0, 0].....
on second object: index info:<NSIndexPath 0xb063e70> 2 indexes [0, 1].....
on third object: index info:<NSIndexPath 0xb042880> 2 indexes [1, 0].....
but on the last object: index info:<NSIndexPath 0x9665790> 2 indexes [2, 17].....
它应该调用[2,0]
请注意,我只是更新这些对象,而不是删除它们或添加新对象。
任何想法都将不胜感激!
答案 0 :(得分:-1)
好的,我已经找到了一个似乎可以解决问题的黑客攻击,但它似乎不是解决问题的最佳方法!有什么想法吗?
我发现从基表调用NSFetchedResultsChangeUpdate时,它只被调用一次,但是当它从搜索/过滤的表中调用时,它被调用了两次(看似100%的时间 - 我想这是为了刷新两者搜索到的表和未搜索的表?)。此外,第一次调用似乎总是有不正确的indexPath,而第二次调用具有正确的信息。如果不正确的indexPath超出范围,第一次调用会使应用程序崩溃。
我的“修复”是通过执行以下操作来忽略第一次调用,如果来自搜索表的NSFetchedResultsChangeUpdate
添加到tableview.h文件的接口:
int changeCall;
然后,在tableview.m文件中,在loadView:
中changeCall = 0;
然后我将NSFetchedResultsChangeUpdate更新为:
case NSFetchedResultsChangeUpdate:
if (searchTermForSegue)
{
if (changeCall == 0) {
changeCall++;
break;
} else if (changeCall == 1){
NSLog(@"index infocalledtwice:%@.....",theIndexPath);
[self fetchedResultsController:self.searchFetchedResultsController configureCell:[tableView cellForRowAtIndexPath:theIndexPath] atIndexPath:theIndexPath];
changeCall = 0;
break;
} else { break; }
} else {
[self fetchedResultsController:controller configureCell:[tableView cellForRowAtIndexPath:theIndexPath] atIndexPath:theIndexPath];
}
break;
基本上,使用changeCall int跳过搜索表更新中的第一个调用,但使用第二个调用来实际更新内容。这不是修复此问题的最佳方法,但是绑带似乎有效。如果有人有更好的答案,我当然会感激。
此外,通过跳过第一个NSFetchedResultsChangeUpdate,未更新未搜索的表以反映新值。我通过在searchDisplayControllerWillEndSearch方法中添加调用来重新加载表来解决这个问题:
- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller
{
[self setSearchTermForSegue:nil];
[self.tableView reloadData];
}
谢谢!