处理Parent-Child managedObjectContexts的应用程序崩溃

时间:2015-09-15 05:14:34

标签: ios swift core-data swift2

这是我创建的示例应用程序应用程序,用于模仿我正在处理的案例。它是使用CoreData和Swift 2.0与Xcode 7 beta4

的单一视图应用程序

因此,在我的View Controller中,我创建了privateObjectContext的{​​{1}}

的孩子
mainManagedObjectContext

我知道保存在孩子MOC中将其同步到父母,然后保存父母会将其保存到持久性商店但是每次保存我的孩子时保存主要MOC MOC没有意义并且达到目的儿童MOC多余。在我完成所有测试之后,我保存了我的父MOC,它确实按预期存储在持久存储中。

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

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
}

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() } } } 返回false,尽管它在ViewController中有变化 我在MOC的生命周期中某处错了吗?

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

managedObjectContext.hasChanges

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

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

        }

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

2 个答案:

答案 0 :(得分:2)

应用程序将终止方法基本上从不使用,所以你不应该依赖它。你也不应该真的编码以保存崩溃,首先你的应用程序不应该崩溃,其次很难知道什么数据在崩溃时无效,所以你可能会破坏其他好的数据。

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

请注意,您还可以以不同方式构造托管对象上下文,以便处理和保存事物,然后将其合并到主上下文中。如果你在保存时真的在UI上看到问题,你可能只想要付出努力。

严格来说,问题在于您没有保存子MOC(至少不在我们能看到的代码中)。因此,当你来保存主MOC时,它还没有任何子更改,也没有任何东西可以保存。

答案 1 :(得分:1)

如果您要进行大量保存,并且正如@Wain正确指出的那样,在终止时执行保存并不是一个好主意,有一种更推荐的方法可以在不阻塞主线程的情况下执行此操作。您将需要创建与存储协调器关联的根上下文,并在非主队列中运行。您的主要上下文可以是此上下文的子级。

请参阅

中的“异步保存”部分

https://www.cocoanetics.com/2012/07/multi-context-coredata/