swift - 核心数据多线程问题

标签 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. 一个“NSPersistentStoreCoordinator”只能处理一个 NSManagedObjectModel。你就在这里。但是拥有多个“NSPersistentStoreCoordinator”需要多个“NSManagedObjectModel”(.xcdatamodeld 文件)。这种情况非常罕见。

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

The NSPrivateQueueConcurrencyType configuration creates its own queue upon initialization and can be used only on that queue. Because the queue is private and internal to the NSManagedObjectContext instance, it can only be accessed through the performBlock: and the performBlockAndWait: methods.

这是同一页的另一个,

NSManagedObject instances are not intended to be passed between queues. Doing so can result in corruption of the data and termination of the application. When it is necessary to hand off a managed object reference from one queue to another, it must be done through NSManagedObjectID instances.

关于swift - 核心数据多线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58101006/

相关文章:

ios - 如何在 Swift 中正确推进 PageViewController

c - 多线程程序中线程的执行顺序

swift - 如何将图像从 collectionviewcell 存储到核心数据

windows - 关于消息循环的问题

ios - 将表的行数设置为特定实体

core-data - 使用 Core Data/Bindings 建模用户可订购列表

iOS异步功能不按顺序

ios - 使用 Xcode 出现错误 "No such module",但框架存在

ios - 不能在动画 block 中更改隐藏属性

linux - 如何检查 Linux 线程的状态?