NSFetchedResultsController сводит меня с ума - PullRequest
2 голосов
/ 14 марта 2010

Я создавал приложение с 1 месяца, используя NSFetchedResultsController, и я тестировал приложение на 3.1.2 SDK. Проблема в том, что я использовал NSFetchedResultsController повсюду в своем приложении и работал над версией SDK 3.1.2, теперь мой клиент говорит, что я должен сделать его совместимым с версией 3.0, и срок почти наступил. *

Но происходит сбой каждый раз, когда я меняю объект, обрабатываемый контроллером, приложение вылетает с очень странными ошибками.

Проблема возникает при удалении последнего объекта в разделе и при внесении изменений в объект, привязанный к другому разделу.

Я использовал пример кода из «Больше iPhone 3 Development Tackling iPhone SDK 3» Дэйва Марка и Джеффа Ламарша. Я также включил некоторые изменения из текст ссылки

Вот пример вывода консоли при сбое приложения.

*** Завершение работы приложения из-за необработанного исключения «NSInternalInconsistencyException», причина: «Неверное обновление: неверное количество разделов. Количество разделов, содержащихся в табличном представлении после обновления (1), должно быть равно количеству разделов, содержащихся в табличном представлении до обновления (2), плюс или минус количество вставленных или удаленных разделов (2 вставлено, 0 удален). 2010-03-14 16: 23: 29.758 Instaproofs [5879: 207] Стек: ( 807902715, 7364425, 807986683, 811271572, 815059090, 815007323, 211023, 4363331, 810589786, 807635429, 810579728, 3620573, 3620227, 3614682, 3609719, 27337, 810595174, 807686849, 807683624, 839142449, 839142646, 814752238 )

Если бы я знал, что NSFetchedResultsController настолько глючит, я бы никогда не использовал его.

Так что мне нужно, чтобы мой NSFetchedResultsControllerDelegate нормально работал на SDK 3.0 и выше.

Было бы спасение жизни, если бы кто-нибудь помог мне понять, что я делаю неправильно.

Ответы [ 2 ]

5 голосов
/ 26 марта 2010

Из ваших сообщений об ошибках следует, что вы вставляете разделы в таблицу, когда их следует удалять. Ваш источник данных tableView предоставляет только один раздел после обновлений, даже если вы указали tableView всего четыре раздела.

Я не думаю, что это тот случай, когда NSFetchedResultsController содержит ошибки, скорее, это сложно реализовать вне простых случаев использования. Ваши сбои почти наверняка происходят в результате вашего контроллера: didChangeObject: atIndexPath: forChangeType: newIndexPath делегат метод. Ключ к успешной реализации этого метода (по крайней мере, по моему опыту) заключается в том, чтобы помнить, что changeTypes управляются как объектами, так и indexPath. Это делает «обновления» и «движется» сложно концептуально.

Рассмотрим ситуацию, когда управляемый объект изменяется так, что он сортируется под новым sectionNameKeyPath. Концептуально мы считаем объект «перемещенным» в новый раздел, поскольку fetchedResultsController теперь сортирует его под новым заголовком в tableView. Однако если indexPath объекта не изменяется, fetchedResultsController считает это «обновлением», а не «перемещением».

Что еще хуже, несмотря на то, что измененный управляемый объект все еще сохраняет тот же indexPath, другие объекты в fetchedResultsController могут теперь иметь новые indexPaths, потому что они были изменены в результате изменения. Это означает, что вам придется вручную обрабатывать вставки разделов и удаления разделов в разделе «update» вашего метода делегата. Аналогичные проблемы необходимо будет решить в разделе «Перемещение» вашего метода делегата.

Не пытаясь объяснить это множеством слов, исправление Ламарша пытается решить эту проблему в общем виде, который учитывает как можно больше вариантов использования. Пытаясь понять проблему с точки зрения вашего варианта использования, вы сможете значительно снизить сложность кода, который использует LaMarche. Сконцентрируйтесь конкретно на разделах «update» и «move» вашего метода делегата, так как они являются наиболее вероятными виновниками вашей проблемы.

0 голосов
/ 16 июня 2010

Проверить этот ресурс:

http://iphonedevelopment.blogspot.com/2009/11/i-know-youre-tired-of-hearing-about.html

Мне очень помогли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...