gpt4 book ai didi

swift - 核心数据多线程问题

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

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

  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/

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