gpt4 book ai didi

ios - 状态恢复和托管对象崩溃

转载 作者:行者123 更新时间:2023-11-30 11:27:04 24 4
gpt4 key购买 nike

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

当我从主联系人列表中选择一个特定的人时,我将 Person 的 nsmanagementobject 传递给新的 View Controller ,并在获取我对该人进行的访问时将其用作谓词。

此时问题是由状态恢复引起的。我希望能够返回此人的页面(以及整个应用程序中的其他一些实例,但这一个示例涵盖了该问题),但因为我通过 segue 传递 Person 对象,所以该对象现在为零,这导致我的应用程序崩溃两次,然后启动到主屏幕,似乎正在清除和恢复数据。

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

下面是我的 fetchedresultscontroller,崩溃发生在谓词行上,表示 self.person 为零

 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>

}()

我将重申,从顶部使用该应用程序时,这一切都可以正常工作,并且正如预期的那样,它只会在尝试恢复状态时崩溃。

我已经做了很多不同的尝试,尝试将什么放入编码器可恢复状态,但没有任何方法可以阻止崩溃。这似乎是经常出现的事情,但我缺乏找到任何信息让我感到困惑。

感谢您的宝贵时间。

最佳答案

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

  • 您有一个实现 viewController(withRestorationIdentifierPath:coder:) 的恢复类。这是配置您提供的 View Controller 的机会。

  • View Controller 被发送decodeRestorableState(with:)。这是配置 View Controller 的另一个机会。请注意,这是 viewDidLoad 之后。

  • View Controller 被发送applicationFinishedRestoringState。这是您配置 View Controller 的最后机会。

现在让我们考虑一下如何更新此 View Controller 上的界面。时机很棘手,因为你不知道时机是什么。特别是,您可能在 viewDidLoad 中拥有代码,该代码假定所有属性均已设置,并相应地配置界面。但在这种情况下,它们可能尚未被设置。

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

就您而言,这将是self.person。在 viewDidLoad 中,您需要检查 self.person,如果它是 nil,请不要尝试创建您的获取结果 Controller 。然后 applicationFinishedRestoringState 出现,现在您可能已经配置了 self.person(在您的 decodeRestorableState 中),并且您可以通过您的获取结果 Controller 更新界面。

关于ios - 状态恢复和托管对象崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50628963/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com