3

Я начинаю пытаться добавить поддержку сохранения и восстановления состояния в приложение iOS, в котором есть компонент Core Data, к которому я обращаюсь через UIManagedDocument.Стратегии сохранения и восстановления состояния с объектами Core Data в UIManagedDocument

Я начинаю добавлять идентификаторы восстановления в контроллеры просмотра и подключаю необходимые функции (в настоящее время пустые) в своем AppDelegate и контроллерах.

У меня есть объект, на который потенциально могут ссылаться несколько контроллеров представлений, поэтому я планирую попытаться сохранить и восстановить его в своем AppDelegate и просто иметь соответствующие контроллеры представлений, чтобы получить объект из AppDelegate. Сроки этого могут быть сложными, поскольку метод делегирования приложения didRecodeRestorableState происходит после того, как все представления уже вызвали свои собственные методы decodeRestorableStateWithCoder.

Моя основная проблема заключается в том, что этот общий класс, а также несколько ViewControllers все хотят сохранить и восстановить свойства NSManagedObject. Я надеюсь, что смогу использовать URIRпредставление объекта для облегчения этого, но проблема, с которой я столкнулся, - это мой AppDelegate, который откроет мой UIManagedDocument в моем методе willFinishLaunchingWithOptions в AppDelegate. Это делается с помощью метода UIManagedDocument openWithCompletionHandler. Из-за потоковой передачи этого открытия документ успешно открывается после того, как все мои представления и делегат приложения уже попытались восстановить их сохраненное состояние. AppDelegate отправляет уведомление после того, как документ готов к использованию, поэтому все мои контроллеры могут прослушивать это уведомление.

Я думаю, я просто удивляюсь, что это лучшая или даже стратегия для решения этой проблемы. Моим объектам нужно будет удерживать URIRпредложения, которые они восстанавливают, и только один раз, когда документ (и это NSManagedObjectContext) готов, попытайтесь найти и установить соответствующие NSManagedObjects, которые они сохранили. Таким образом, восстановление происходит намного позже, чем вызовы для выполнения восстановления, я предполагаю, что обычно выполняют всю свою восстановительную работу. Я беспокоюсь, может ли контроллер потенциально казаться пустым в течение короткого периода времени, пока он ждет открытия документа, а затем правильно инициализируется.

Есть ли какая-либо цель блокировать и откладывать открытие моего документа в этом случае, так что да, приложение занимает больше времени, чтобы открыть, но может, по крайней мере, восстановить более корректно все данные, необходимые перед появлением любых представлений. Существуют ли таймеры, чтобы убедиться, что определенные методы не занимают слишком много времени? Было бы правильнее показывать другое представление, пока мы находимся в этом состоянии неопределенности, не совсем уверен, как это сделать, но это то, что вы можете увидеть в других приложениях, например, сказать, что приложение Facebook, которое зависит от сети подключение.

В настоящее время я не могу найти реального объяснения такого рода проблем в документации.

Любая помощь, как всегда, очень ценится! Cheers

ответ

1

В конце я только что внедрил уведомления, когда мой UIManagedDocument закончил загрузку. Они были подобраны всеми контроллерами, которые имели coredata, управляли объектами, которые он хотел восстановить. Во время восстановления я сохраняю кодированные URI, а позже, получив это уведомление UIManagedDocument, я просто расшифровал URI на свои соответствующие управляемые объекты.

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

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

К сожалению, с тех пор я ударил камень преткновения, где методы UIDataSourceModelAssociation вызывают ОС до того, как мой UIManagedDocument завершит открытие. К сожалению, это означает, что я не могу ничего полезного. Так что мне действительно нужно что-то сделать, это отложить восстановление моего приложения до тех пор, пока все не загрузится из POV CoreData UIManagedDocument. Эта проблема продолжается ...