Стратегии сохранения и восстановления состояния с объектами Core Data в UIManagedDocument
Я начинаю пытаться добавить поддержку сохранения состояния и восстановления в мое приложение iOS, в котором есть компонент Core Data, к которому я получаю доступ через UIManagedDocument.
Я начинаю добавлять идентификаторы восстановления в мои контроллеры представления и подключил необходимые функции (в настоящее время пустые) в моем AppDelegate и контроллерах.
У меня есть объект, на который потенциально могут ссылаться несколько контроллеров представления, поэтому я планирую попытаться сохранить и восстановить его в моем AppDelegate и просто сделать так, чтобы соответствующие контроллеры представления извлекли объект из AppDelegate. Сроки могут быть хитрыми, так как метод делегата приложения didRecodeRestorableState происходит после того, как все представления уже вызвали свои собственные методы decodeRestorableStateWithCoder.
Моя главная проблема заключается в том, что этот общий класс, а также несколько ViewControllers хотят, чтобы свойства NSManagedObject были сохранены и восстановлены. Я надеюсь, что смогу использовать URIRepresentation объекта, чтобы облегчить это, но проблема, с которой я столкнулся, заключается в том, что мой AppDelegate откроет мой UIManagedDocument в методе willFinishLaunchingWithOptions моего AppDelegate. Это делается с помощью метода openWithCompletionHandler UIManagedDocument. Из-за многопоточности этого открытия документ успешно открывается после того, как все мои представления и делегаты приложения уже попытались восстановить свое сохраненное состояние. AppDelegate отправляет уведомление, когда документ готов к использованию, поэтому все мои контроллеры представления могут прослушивать это уведомление.
Думаю, мне просто интересно, является ли это лучшей или даже единственной стратегией борьбы с этим. Мои объекты должны будут хранить URIRepresentations, которые они восстанавливают, и только после того, как документ (и это NSManagedObjectContext) готов, попытаться фактически найти и установить соответствующие NSManagedObjects, которые они сохранили. Таким образом, восстановление происходит намного позже, чем, как я полагаю, вызовы для выполнения восстановления обычно выполняют всю их работу по восстановлению. Я волнуюсь, может ли контроллер казаться пустым в течение короткого периода времени, пока он ждет, пока документ откроется, а затем будет правильно инициализирован.
Есть ли в этом случае какая-либо цель блокировать и задерживать открытие моего документа, так что да, приложению требуется больше времени для открытия, но, по крайней мере, оно может восстановиться более корректно со всеми необходимыми данными, прежде чем появятся какие-либо представления. Есть ли таймеры, запускаемые для того, чтобы определенные методы не занимали слишком много времени? Было бы правильнее показать другое представление, пока мы находимся в этом неопределенном состоянии, не совсем уверенный, как это сделать, но это то, что вы можете увидеть в других приложениях, таких как, например, приложение Facebook, которое зависит от сети подключение.
Я не могу найти реального объяснения такого рода проблем в документации до сих пор.
Любая помощь, как всегда, очень ценится! ура
1 ответ
В конце я только что реализовал уведомления о том, когда мой UIManagedDocument закончил загрузку. Они были подхвачены всеми контроллерами, которые имели управляемые объекты coredata, которые он хотел восстановить. Во время восстановления я продолжаю удерживать закодированные URI, а позже при получении этого уведомления о готовности UIManagedDocument я просто декодировал URI в соответствующие им управляемые объекты.
Проблема с общим объектом, которую я описал, была решена путем кодирования и восстановления в одном месте из моего appDelegate, а затем с помощью другого уведомления систем, чтобы сообщить им, что этот общий объект теперь полностью декодирован и доступен для использования.
Не идеально и требует создания большого количества иерархий методов, чтобы гарантировать, что все объекты были декодированы правильно, но это работает нормально.
К сожалению, с тех пор я наткнулся на камень преткновения, когда ОС вызывает методы протокола UIDataSourceModelAssociation до того, как мой UIManagedDocument завершил открытие. К сожалению, это означает, что я не могу сделать что-нибудь полезное. Так что мне действительно нужно как-то отложить восстановление моего приложения, пока все не загрузится из CoreData UIManagedDocument POV. Эта проблема продолжается...