状态恢复和管理对象崩溃

时间:2018-05-31 16:34:23

标签: ios swift core-data state-restoration

我一直无法找到任何有助于这个主题的信息,而且我有点新,自学成才,对任何无知道歉。我正在制作一个联系方式应用程序,允许您记录与特定人员进行的访问。我正在使用Core Data来存储数据,并且具有将Person实体链接到Visit实体的一对多关系。

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

问题来自于此时的国家恢复。我希望能够返回到这个人的页面(以及整个应用程序中的一些其他实例,但是这个例子涵盖了这个问题)但是因为我通过segue传递了Person对象,那个对象现在是nil,这导致我的应用程序崩溃两次,然后它启动到主屏幕,似乎清除和恢复数据。

无论我尝试存储在encoderestorablestate:with,按home,然后在xcode中停止应用程序然后重新启动xcode,在此之前,从未调用decoderestorablestate func并且崩溃的人为nil。

下面是我的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>

}()

我将完美地重申这一切,并且正如预期的那样,当从顶部使用应用程序时,它只会在尝试恢复状态时崩溃。

我已经做了很多不同的尝试,将什么放在encoderestorablestate中,但没有任何东西阻止崩溃。这似乎会出现很多事情,但我找不到任何信息让我感到困惑。

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

您没有提供足够的信息来追踪问题,但这是查看问题的一般方法。将问题分为三个部分:

  • 您有一个实现var temp123; pdfDoc.pipe(temp123 = fs.createWriteStream('./PDF/' + name), { encoding:'utf16' }); pdfDoc.end(); temp123.on('finish', async function () { // do send PDF file res.download('name.pdf'); });` 的恢复类。这是配置您正在提供的视图控制器的机会。

  • 视图控制器已发送viewController(withRestorationIdentifierPath:coder:)。这是配置视图控制器的另一个机会。请注意,这是 decodeRestorableState(with:)后的

  • 视图控制器已发送viewDidLoad。这是配置视图控制器的最后机会。

现在让我们考虑一下如何更新此视图控制器上的界面。时机很棘手,因为你不知道时机会是什么。特别是,您可能在applicationFinishedRestoringState中拥有代码,该代码假定已设置所有属性,并相应地配置接口。但在这种情况下,他们可能已经没有设置。

因此,要使状态恢复正常工作,您需要将viewDidLoad代码重写为不做任何关于是否已设置属性的假设

在您的情况下,那将是viewDidLoad。在self.person中,您需要检查viewDidLoad,如果是self.person,请不要尝试制作您获取的结果控制器。然后nil出现,现在您可能已配置applicationFinishedRestoringState(在self.person中),您可以通过获取的结果控制器更新界面。< / p>