Стратегии сохранения и восстановления состояния с объектами Core Data в UIManagedDocument

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

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

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

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

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

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

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

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


person jimbobuk    schedule 20.08.2014    source источник


Ответы (1)


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

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

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

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

person jimbobuk    schedule 16.09.2014