2012-06-04 2 views
0

Так что я почти понял эту вещь, но я обрушился на NSFetchedResultsChangeUpdate, когда я обновляю свой managedObjectContext из подробного представления, которое было введено после поиска в таблице.NSFetchedResultsChangeUpdate сбой при вызове в обычном табличном представлении

У меня есть табличное представление, созданное из набора данных ядра. Я могу ввести подробный вид из этой таблицы и внести изменения без каких-либо проблем. Я также могу выполнять поиск в таблице и вносить изменения САМОМ времени без каких-либо проблем. Однако на некоторых объектах я получаю «Исключение было обнаружено во время обработки изменений 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; 

Когда стол не разыскивается, он запускает метод еще и работает 100% времени. Когда таблица выполняется поиск, она запускает if (searchTermForSegue) и работает большую часть времени, но не всегда. Я запустил theIndexPath и обнаружил следующее:

Когда он работает, theIndexPath правильно сообщает объекты indexPat, когда он терпит неудачу, вызывается неправильный вызов IndexPath. Например, если я делаю поиск, который сужает 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

Хорошо, я выяснил, что проблема заключается в исправлении проблемы, но это не похоже на лучший способ решить проблему! Есть предположения?

Я обнаружил, что когда 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]; 
} 

Спасибо!

Смежные вопросы