swift - 核心数据多线程问题
问题描述
我已经在多线程环境中实现了核心数据,我对此有一些疑问和问题,我在下面列出:-
几个博客和 SO 答案说你应该有一个
NSPersistentStoreCoordinator
(PSC),但据我了解,“PSC”应该等于 ManagedObjectModel 的数量。如果我错了,请纠正我。根据文档,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
}
解决方案
一个“NSPersistentStoreCoordinator”只能处理一个 NSManagedObjectModel。你就在这里。但是拥有多个“NSPersistentStoreCoordinator”需要多个“NSManagedObjectModel”(.xcdatamodeld 文件)。这种情况非常罕见。
并发崩溃本质上是难以捉摸的。它们仅在多个线程以纳秒精度同时访问相同数据时发生。当数百名用户使用该应用程序时,通常会在生产环境中出现这些难以调试的错误。您想对用户说的最后一件事是我们丢失了您的所有数据(无论是损坏还是崩溃)。所以你最好听听这里的文档。我们犯了同样的错误,在我们的一个旧应用程序的不同线程之间传递 NSManagedObjects 并付出了代价。重构代码花了很长时间。最后来自 Core Data Programming Guide链接。
NSPrivateQueueConcurrencyType 配置在初始化时创建自己的队列,并且只能在该队列上使用。因为队列是私有的并且在 NSManagedObjectContext 实例内部,它只能通过 performBlock: 和 performBlockAndWait: 方法访问。
这是同一页面的另一个,
NSManagedObject 实例不打算在队列之间传递。这样做可能会导致数据损坏和应用程序终止。当需要将托管对象引用从一个队列传递到另一个队列时,必须通过 NSManagedObjectID 实例来完成。
推荐阅读
- git - Git 认为我正在推送到不同的(不存在的)存储库?
- java - 如果我的 JVM 是 1.8,为什么我必须将 targetCompatibility 设置为 JavaVersion.VERSION_1_8
- java - c:if 带有来自模型的变量
- java - 如何通过java中的soap头传递多个参数?
- android - MySQL数据库发生变化时如何通知我的android应用
- html - 如何将父 div 的高度设置为仅一个(多个)子元素的高度
- ruby-on-rails - Ruby On Rails - NoMethodError:nil:NilClass 的未定义方法“[]”
- c# - 写一个 void 作为参数
- html - html - “宽度:100%”页面中的文本溢出
- javascript - 检查空输入和显示消息的简单表单验证