ios - 从另一个线程调用的 CoreData ContextObjectsDidChangeNotification

标签 ios multithreading core-data uimanageddocument

最近在调查 UIPickerView 的一些奇怪的 UI 行为时,我得出的结论是因为我在一个名为观察 NSManagedObjectContextObjectsDidChangeNotification 的选择器中重新加载它的组件。问题是,至少我很确定这将始终从主线程调用。但是我错了。我正在使用 UIManagedDocument,有时我会从另一个线程收到以下通知:

NSConcreteNotification 0x14a2664b0 {name = NSObjectsChangedInManagingContextNotification; object = <NSManagedObjectContext: 0x14a3e1be0>; userInfo = {
invalidatedAll =     (
    "0xd00000000d5c000e <x-coredata://B12EF0BD-E372-44D2-AF2F-8E28C5EF3E00/AdditionalAssetAttributes/p855>",
    "0xd00000000d58000e <x-coredata://B12EF0BD-E372-44D2-AF2F-8E28C5EF3E00/AdditionalAssetAttributes/p854>",
    "0xd00000000d5c000c <x-coredata://B12EF0BD-E372-44D2-AF2F-8E28C5EF3E00/Asset/p855>",
    "0xd00000000d58000c <x-coredata://B12EF0BD-E372-44D2-AF2F-8E28C5EF3E00/Asset/p854>",
    "0xd000000001d40018 <x-coredata://B12EF0BD-E372-44D2-AF2F-8E28C5EF3E00/SidecarFile/p117>",
    "0xd000000001d00018 <x-coredata://B12EF0BD-E372-44D2-AF2F-8E28C5EF3E00/SidecarFile/p116>"
);
managedObjectContext = "<NSManagedObjectContext: 0x14a3e1be0>";

我的问题是:有谁知道为什么要调用此通知? invalidateAll 元素的用途是什么。我也不知道什么是 AdditionalAssetAttributesSidecarFile

谢谢!

最佳答案

与 iOS 11 一样,我经常看到此通知。文档不多,但似乎通知的 userInfo 包含键 NSInvalidatedAllObjectsKey(invalidatedAll),那么您必须从您的应用程序也引用的文档中重新获取所有 NSManagedObject。如果看不到,它们就不再可用。数组的内容可以忽略(例如我经常发现它是空的)

关于ios - 从另一个线程调用的 CoreData ContextObjectsDidChangeNotification,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34757330/

相关文章:

ios - GLKViewController 在几个小时后挂起

c# - 如何在 C# 中执行线程安全函数内存?

ios - 使用核心数据

objective-c - committedValuesForKeys 在 NSManaged 对象子类上返回一个空字典

objective-c - iOS 核心数据索引属性没有提高性能

ios - 如何检查强制退出是否已禁用通知

ios - 使用 carthage 集成 ReactiveCocoa 失败

ios - 线程安全队列

c++ - 如何捕获临界区抛出的异常?

C# 多线程按值传递还是引用传递?