Государственное восстановление и разрушение управляемых объектов - PullRequest
0 голосов
/ 31 мая 2018

Мне не удалось найти какую-либо информацию, которая была бы полезна для этой темы, и я несколько новичок и самоучка, поэтому извиняюсь за любое невежество.Я делаю приложение в стиле контактов, которое позволяет записывать посещения, сделанные с конкретным человеком.Я использую Базовые данные для хранения данных и связи «один ко многим», связывающей сущность «Человек» с сущностью «Визит».

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

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

Независимо от того, что я пытаюсь сохранить в encoderestorablestate: с, нажмите home, затем остановите приложение в xcode, затем повторно запуститеxcode, функция decoderestorablestate никогда не вызывается и вылетает с нулем до этого.

Ниже мой контроллер fetchedresults, и происходит сбой в строке предиката, говоря, что self.person равен nil

 lazy var fetchedResultsController: NSFetchedResultsController<Visit> = {

    // Initialize Fetch Request
    let fetchRequest: NSFetchRequest<NSManagedObject> = NSFetchRequest(entityName: "Visit")
    // Add Sort Descriptors
    let predicate = NSPredicate(format: "person == %@", self.person!)
    fetchRequest.predicate = predicate

    let sortDescriptor = NSSortDescriptor(key: "date", ascending: false)
    fetchRequest.sortDescriptors = [sortDescriptor]

    // Initialize Fetched Results Controller
    let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: nil, cacheName: nil)

    // Configure Fetched Results Controller
    fetchedResultsController.delegate = self

    return fetchedResultsController as! NSFetchedResultsController<Visit>

}()

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

Я предпринял много разных попыток добавить кодируемое восстанавливаемое состояние, но ничего не остановило сбой.Это кажется чем-то большим, но мое отсутствие поиска какой-либо информации меня смутило.

Спасибо за ваше время.

1 Ответ

0 голосов
/ 31 мая 2018

Вы не предоставили достаточно информации, чтобы отследить проблему, но вот общий взгляд на проблему.Рассмотрим проблему в трех частях:

  • У вас есть класс восстановления, который реализует viewController(withRestorationIdentifierPath:coder:).Это возможность настроить контроллер представления, который вы поставляете.

  • Контроллер представления отправляется decodeRestorableState(with:).Это еще одна возможность настроить вид контроллера.Обратите внимание, что это приходит после viewDidLoad.

  • Контроллер представления отправляется applicationFinishedRestoringState.Это ваша последняя возможность настроить контроллер представления.

Теперь давайте подумаем, как вы собираетесь обновить интерфейс этого контроллера представления.Время сложно, потому что вы не знаете, какое время будет.В частности, у вас может быть код в viewDidLoad, который предполагает, что все свойства были установлены, и настраивает интерфейс соответствующим образом.Но в этой ситуации они, вероятно, установили , а не .

Таким образом, чтобы восстановление состояния работало, вам нужно переписать свой код viewDidLoad, чтобы не делать предположений о том, были ли установлены свойства.

В вашем случае это будет self.personviewDidLoad вам нужно проверить self.person и, если это nil, пока не пытаться настроить ваш выбранный контроллер результатов.Затем приходит applicationFinishedRestoringState, а сейчас вы, вероятно, настроили self.person (в вашем decodeRestorableState), и вы можете обновить интерфейс через ваш полученный контроллер результатов.

...