gpt4 book ai didi

ios - 意外的核心数据多线程违规

转载 作者:IT王子 更新时间:2023-10-29 05:30:46 26 4
gpt4 key购买 nike

我正在使用 Apple 的并发核心数据调试器。

-com.apple.CoreData.ConcurrencyDebug 1

我不时收到__Multithreading_Violation_AllThatIsLeftToUsIsHonor__ ,即使我几乎可以肯定没有违反线程。

这是发生异常的部分代码(代码是扩展 NSManagedObject 的协议(protocol)的一部分):

public static func find(arrayBy predicate: NSPredicate, sort: [NSSortDescriptor] = [], limit: Int? = nil) -> [Self] {
let fetchRequest = NSFetchRequest<Self>(entityName: "\(Self.self)")
fetchRequest.predicate = predicate
fetchRequest.sortDescriptors = sort

do {
return try Context.current.fetch(fetchRequest) // Exception!!!
} catch let error {
Logger.fatal("Failed to perform fetch: \(error)")
return []
}
}

代码在上下文的 perform: 中执行 block 。

这是线程信息:

enter image description here

和调试器信息以确认执行是在正确的 NSManagedContext 上执行的:

(lldb) po Context.current
<StoreContext: 0x7f854b556610>

实体名称提取成功:

po fetchRequest.entityName!
"Position"

Predicate 由纯 String 对象构成(完全不使用托管对象):

(lldb) po fetchRequest.predicate!
ANY employees.company.id == "282372"

在这种情况下根本不使用排序描述符:

po fetchRequest.sortDescriptors!
0 elements

限制被完全忽略。

我错过了什么?有谁知道这里可能出什么问题吗?

编辑:

为了澄清,Context.current在发送 block 之前设置:

Context.current = managedObjectContext
managedObjectContext.performAndWait {
//...
}

您可以在屏幕截图中看到 Thread 13Queue: NSManagedObject 0x7f854b556610 (serial) 上运行.另外,发生异常时 Context.current返回 <StoreContext: 0x7f854b556610> .通过查看内存地址,很容易得出 block 在正确的队列上执行的结论。

最佳答案

建议避免使用 .performAndWait API,仅在极少数情况下使用,当其他一切都具有 failed!
在整个应用程序中评估 Context.currentmanagedObjectContext.perform 的变形。
此更改的效果是在所有 数据库操作中增加异步性。
这听起来可能是一个大规模要求的改变,但请相信我,只需决定将 Core Data 视为一个完全异步的 API,这样生活会好得多。
我确定您当前面临的崩溃是 .performAndWait

损坏行为的复合结果

This , thisthis有一些关于该主题的好读物。

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

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