在搜索到的tableview上调用时,NSFetchedResultsChangeUpdate崩溃

时间:2012-06-04 13:29:43

标签: uitableview uisearchbar nsfetchedresultscontroller

所以我几乎已经弄清楚了这一点,但是当我从搜索表格后输入的详细视图中更新我的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]

请注意,我只是更新这些对象,而不是删除它们或添加新对象。

任何想法都将不胜感激!

1 个答案:

答案 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];
}

谢谢!