核心数据多线程问题

时间:2019-09-25 14:41:57

标签: swift multithreading core-data

我已经在多线程环境中实现了核心数据,我对此有一些疑问和问题,我在下面列出:-

  1. 几个博客和SO回答都说您应该有一个NSPersistentStoreCoordinator(PSC),但据我了解,“ PSC”应等于ManagedObjectModel的数量。如果我错了,请纠正我。
  2. 根据文档,ManagedObjectContext对象应等于我们创建的用于在特定模型中执行活动的线程数。令我惊讶的是,我使用了来自不同线程的单个ManagedObjectContext对象,并且同时执行了获取操作,而没有发生任何崩溃,请查找以下代码:-

    我从不同的线程调用下面的函数,并确保仅创建单个MOC实例。请清除以上所有我有的疑问

func fetchUserDetail(productId : Int) -> User_Details?  {

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "User_Details")
    do {
        fetchRequest.predicate = NSPredicate(format: "product_id == %d", productId)

        let results:[User_Details]? = try (singleinstancemanagedObjectContext.fetch(fetchRequest) as? [User_Details])

        if let results = results {
            ..... logic .....
        }
    } catch let error as NSError {
    }
    return nil

}

1 个答案:

答案 0 :(得分:1)

  1. 一个“ NSPersistentStoreCoordinator”只能处理一个NSManagedObjectModel。你在这里但是具有多个“ NSPersistentStoreCoordinator”需要多个“ NSManagedObjectModel”(。xcdatamodeld文件)。这种情况很少见。

  2. 并发崩溃本质上是难以捉摸的。它们仅在多个线程以纳秒级精度同时访问同一数据时发生。这些错误很难调试,通常会在数百个用户使用该应用程序时在生产环境中发生。您要对用户说的最后一件事是我们丢失了所有数据(无论什么都损坏或崩溃)。因此,您最好阅读此处的文档。在一个旧应用程序的不同线程之间传递NSManagedObjects时,我们犯了同样的错误,并为此付出了代价。重构代码花了很长时间。最后来自《核心数据编程指南》 link

  

NSPrivateQueueConcurrencyType配置创建自己的队列   在初始化时,只能在该队列上使用。因为   队列是私有的,并且在NSManagedObjectContext实例内部,   它只能通过performBlock:和   performBlockAndWait:方法。

这是同一页上的另一个

  

NSManagedObject实例不打算在之间传递   队列。这样做可能导致数据损坏和终止   的应用程序。何时需要移交托管对象   从一个队列到另一个队列的引用,必须通过   NSManagedObjectID实例。