Должно ли мое приложение использовать только один контекст управляемого объекта? - PullRequest
0 голосов
/ 20 июня 2011

Подходит ли для моего приложения несколько контекстов управляемых объектов? Я шел по этому маршруту (передавая свой MOC от одного экземпляра подкласса UIViewController к следующему), но я начинаю сталкиваться с ошибками EXC_BAD_ACCESS и мне интересно, может ли это быть связано.

Итак, когда я хочу использовать несколько ManagedObjectContexts и (когда) я должен использовать только один?

Edit:

В моем приложении, основанном на UISplitViewController, при удалении строки в моем главном представлении только после представления второго представления в основном подробном представлении мой контроллер подробного просмотра аварийно завершает работу на respondsToSelector, который я не звони никогда.

Редактировать 2:

По сути, у меня есть основной вид и подробный вид. В подробном представлении пользователь нажимает кнопку. Кнопка вызывает вид «новая транзакция». Вместо того, чтобы представлять вид модально, я вручную добавляю его в детальный вид. Если пользователь вносит изменения в контекст управляемого объекта в этом новом представлении, а затем пытается удалить строку в главном представлении, это вызывает сбой. Если я представлю тот же вид модально, все работает просто отлично.

Кроме того, NSZombieEnabled говорит, что метод respondsToSelector вызывается в (родительском) подробном представлении. Я не называю это нигде в моем приложении. Может ли это быть проблема с памятью? Потоковая проблема? Я явно не создаю никаких новых потоков, но я не знаю, есть ли какие-либо потоки, созданные за кулисами.

В чем может быть проблема?

РЕДАКТИРОВАТЬ3:

Эта проблема, кажется, становится лучше. В моем подробном представлении у меня также есть таблица, в которой, как и в главном представлении, используется контроллер NSFetchedResults. Когда я удаляю ячейку, я также скрываю подробный вид, который вызывает ее освобождение. Выпуск подробного представления приводит к сбою приложения. Если я не удаляю подробное представление, транзакции в таблице подробного представления удаляются. (Это потому, что у меня базовые данные установлены каскадно при удалении учетной записи.)

Итак, возможно, у меня слишком много NSFetchResultsController объектов? Я считаю, что происходит следующее:

Когда я удаляю строку, значение NSFetchResultsController изменяется, и поэтому он пытается запустить метод делегата. Тем не менее, подробный вид был удален, и его контроллер представления освобожден. Таким образом, система делегатов запускает метод controllerDidChange и вылетает при попытке доставить уведомление в подробный вид.

Как я могу это исправить?

1 Ответ

4 голосов
/ 20 июня 2011

Вообще говоря, вы должны использовать только один, если вам не нужен доступ к данным из нескольких потоков, в этом случае вам понадобится один для каждого потока.

Вам определенно не нужно создавать один для UIViewController.

Возможно, вы захотите еще раз подумать, следует ли вам в любом случае передавать весь контекст управляемого объекта в UIViewController - как насчет простой передачи ему объектов модели, необходимых для выполнения своей работы?

...