gpt4 book ai didi

ios - 处理父子 managedObjectContexts 的应用程序崩溃

转载 作者:行者123 更新时间:2023-11-28 11:14:42 24 4
gpt4 key购买 nike

这是我创建的示例应用程序,用于模拟我正在处理的案例。它是一个单 View 应用程序,使用 CoreData 和 Swift 2.0 以及 Xcode 7 beta4

因此,在我的 View Controller 中,我创建了一个 privateObjectContext,它是 mainManagedObjectContext

的子项
let mainMOC = AppDelegate().managedObjectContext
var privateObjectContext : NSManagedObjectContext?

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.

privateObjectContext = NSManagedObjectContext(concurrencyType: .PrivateQueueConcurrencyType)
privateObjectContext?.parentContext = mainMOC
}

我知道保存在子 MOC 中会将其同步到父级,然后保存父级会将其保存到持久存储中,但是每次我保存我的子 MOC 时保存主 MOC 是没有意义的,并且使子级的目的MOC 冗余。因此,在我完成所有测试后,我保存了我的父级 MOC,它确实按预期存储在持久存储中。

但是当我模拟应用程序崩溃时(通过转到任务管理器并强行终止应用程序),它不会存储在持久管理器中;因为这个它应该有

func applicationWillTerminate(application: UIApplication) {
// Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
// Saves changes in the application's managed object context before the application terminates.
self.saveContext()
}

func saveContext () {
if managedObjectContext.hasChanges {
do {
try managedObjectContext.save()
} catch {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
let nserror = error as NSError
NSLog("Unresolved error \(nserror), \(nserror.userInfo)")
abort()
}
}
}

但是 managedObjectContext.hasChanges 返回 false,尽管它在 ViewController 中发生了变化我在 MOC 生命周期的某个地方错了吗?

--编辑我使用 NSManagedObjectContext 的扩展来批量创建测试对象

privateObjectContext?.performBlock {
self.privateObjectContext?.createTestObjects(100) {
(person: Person, index) in
person.name = "Test Person \(index)"
}
do {
try self.privateObjectContext?.save()
} catch {
print(error)
}

}

在此之后,如果我从我的主 MOC 中获取,那么我会按预期获得 100 条记录。

print(mainMOC.hasChanges) //true
let persons = mainMOC.fetchAll(Person)
print(persons.count) //100

但是在强行让应用程序崩溃后,主 MOC 仍然没有显示任何变化。

最佳答案

应用程序 will terminate 方法基本上从未使用过,因此您不应该依赖它。您也不应该真的通过编码来避免崩溃,首先您的应用不应该崩溃,其次很难知道哪些数据在崩溃时无效,因此您可能会破坏其他好的数据。

通常,您应该立即保存或批量保存到持久存储。

请注意,您还可以以不同方式构建托管对象上下文,以便处理和保存内容,然后合并到主上下文中。如果您在保存时确实在 UI 上看到问题,您可能只想进行这项工作。


严格针对您的问题,问题是您没有保存子 MOC(至少在我们可以看到的代码中没有)。因此,当您开始保存主 MOC 时,它还没有任何子更改,也没有要保存的内容。

关于ios - 处理父子 managedObjectContexts 的应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32578178/

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