从另一个线程调用 CoreData ContextObjectsDidChangeNotification
Posted
技术标签:
【中文标题】从另一个线程调用 CoreData ContextObjectsDidChangeNotification【英文标题】:CoreData ContextObjectsDidChangeNotification called from another thread 【发布时间】:2016-01-13 02:19:29 【问题描述】:最近在调查 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 元素的用途是什么。我也不知道 AdditionalAssetAttributes 或 SidecarFile 是什么。
谢谢!
【问题讨论】:
你在观察NSObjectsChangedInManagingContextNotification
还是NSManagedObjectContextObjectsDidChangeNotification
?您的问题是一个,但您的输出显示另一个。
我认为NSObjectsChangedInManagingContextNotification
是NSManagedObjectContextObjectsDidChangeNotification
的值。
刚刚在这里尝试过:NSLog(@"%@", NSManagedObjectContextObjectsDidChangeNotification);
打印:NSObjectsChangedInManagingContextNotification
【参考方案1】:
我在 ios 11 中经常看到此通知。文档不多,但似乎通知的 userInfo
包含密钥 NSInvalidatedAllObjectsKey
(invalidatedAll),那么你必须从您的应用程序引用的文档中重新获取所有 NSManagedObject。看不到让它们都不再可用。数组的内容可以忽略(例如我经常发现它是空的)
【讨论】:
以上是关于从另一个线程调用 CoreData ContextObjectsDidChangeNotification的主要内容,如果未能解决你的问题,请参考以下文章