代码之家  ›  专栏  ›  技术社区  ›  SwiftedMind

如何正确地更改合并到子上下文中的父NSManagedObjectContext?

  •  0
  • SwiftedMind  · 技术社区  · 5 年前

    我有个关于处理父母和孩子的问题 NSManagedObjectContexts .

    我创建了主上下文(XCode在 CoreData 项目)可访问如下: App.managedObjectContext

    context 要在显示和编辑某些数据的详细视图中使用,例如:

    let context = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
    context.parent = App.managedObjectContext
    context.automaticallyMergesChangesFromParent = true
    
    let detailVC = DetailVC(context: context)
    // present(...)
    

    比如说,在 detailVC 您希望在全局范围内进行更改(以便 App.managedObjectContext 更改并将更改合并到创建的子上下文中)

    // Example:  App.managedObjectContext.delete(/*some object*/)
    try? App.managedObjectContext.save()
    

    这样可以工作,更改将合并到子上下文中。但这会在主队列上执行save。我不应该总是在后台排队换东西吗?我通常的做法是:

    // Get the persistent container whose `viewContext` is App.managedObjectContext
    App.appDelegate.persistentContainer.performBackgroundTask { (privateContext) in
        // Do changes
    }
    

    但是,这些更改不会合并到子上下文中。我该怎么做?

    let newChild = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
    newChild.parent = context.parent
    
    // As I understand it, perform() will run on a background queue in this case, right?  
    newChild.perform {
    
        // Example modification:
        // let object = newChild.object(with: civilization.objectID)
        // newChild.delete(object)
    
        try? newChild.save()
    
        newChild.parent?.perform {
            try? newChild.parent?.save()
        }
    
    }
    

    这似乎有效,但这是否有任何副作用或缺点?它真的在后台队列上运行吗?

    NSManagedObjectContext 学到了一些东西,但我还是不清楚: https://developer.apple.com/documentation/coredata/nsmanagedobjectcontext )

    谢谢!

    0 回复  |  直到 5 年前