Ios 状态恢复和托管对象崩溃

Ios 状态恢复和托管对象崩溃,ios,swift,core-data,state-restoration,Ios,Swift,Core Data,State Restoration,我自己一直找不到任何对这个话题有帮助的信息,我有点新,自学成才,所以对任何无知表示歉意。我正在制作一个联系人风格的应用程序,允许您记录与特定人员的访问。我使用核心数据来存储数据,并且有一个一对多的关系,将个人实体链接到访问实体 当我通过选择一个特定的人从主联系人列表中分离出来时,我将该nsmanagedobject of person传递给新的视图控制器,并在获取我对此人进行的访问时将其用作谓词 问题产生于此时的国家恢复。我希望能够返回到此人的页面(以及整个应用程序中的一些其他实例,但这一示例涵

我自己一直找不到任何对这个话题有帮助的信息,我有点新,自学成才,所以对任何无知表示歉意。我正在制作一个联系人风格的应用程序,允许您记录与特定人员的访问。我使用核心数据来存储数据,并且有一个一对多的关系,将个人实体链接到访问实体

当我通过选择一个特定的人从主联系人列表中分离出来时,我将该nsmanagedobject of person传递给新的视图控制器,并在获取我对此人进行的访问时将其用作谓词

问题产生于此时的国家恢复。我希望能够返回到此人的页面(以及整个应用程序中的一些其他实例,但这一示例涵盖了问题),但由于我通过segue传递person对象,该对象现在为零,这会导致我的应用程序崩溃两次,然后启动到主屏幕,显示清除和恢复数据

无论我尝试在encoderestorablestate中存储什么:使用,按home,然后在xcode中停止应用程序,然后在xcode中重新启动,decoderestorablestate函数永远不会被调用,并且在此之前person为零时崩溃

下面是我的fetchedresultscontroller,崩溃发生在谓词行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>

}()
惰性变量fetchedResultsController:NSFetchedResultsController={
//初始化提取请求
let fetchRequest:NSFetchRequest=NSFetchRequest(entityName:“访问”)
//添加排序描述符
let predicate=NSPredicate(格式:“person=%@”,self.person!)
fetchRequest.predicate=谓词
让sortDescriptor=NSSortDescriptor(键:“日期”,升序:false)
fetchRequest.sortDescriptors=[sortDescriptor]
//初始化获取的结果控制器
设fetchedResultsController=NSFetchedResultsController(fetchRequest:fetchRequest,managedObjectContext:self.managedObjectContext,sectionNameKeyPath:nil,cacheName:nil)
//配置获取的结果控制器
fetchedResultsController.delegate=self
将fetchedResultsController返回为!NSFetchedResultsController
}()
我要重申,这一切都是完美的,正如从顶部使用应用程序时所预期的那样,它只有在尝试恢复状态时才会崩溃

我做了很多不同的尝试,试图用什么来设置encoderestorablestate,但没有任何东西能够阻止崩溃。这似乎会出现很多问题,但我找不到任何信息,这让我感到困惑


谢谢您的时间。

您没有提供足够的信息来追踪问题,但这里有一个解决问题的一般方法。把这个问题分为三个部分:

  • 您有一个实现
    viewController(带有restorationIdentifierPath:coder:)
    的还原类。这是一个配置您提供的视图控制器的机会

  • 视图控制器被发送到decodeRestorableState(带:)。这是配置视图控制器的另一个机会。请注意,这是在
    viewDidLoad
    之后出现的

  • 视图控制器将被发送到applicationFinishedRestoringState。这是配置视图控制器的最后一次机会

现在,让我们考虑如何更新此视图控制器上的接口。时间安排很棘手,因为你不知道时间安排会是什么。特别是,您可能在
viewDidLoad
中有代码,该代码假定所有属性都已设置,并相应地配置接口。但在这种情况下,它们可能尚未设置

因此,要使状态恢复工作,您需要重写
viewDidLoad
代码,以不对是否已设置属性进行假设

在您的情况下,这将是
self.person
。在
viewdiload
中,您需要检查
self.person
,如果它是
nil
,则不要尝试使您的获取结果成为控制器。然后出现了
applicationFinishedRestoringState
,现在您可能已经配置了
self.person
(在
decodeRestorableState
中),并且您可以通过获取的结果控制器更新界面