从另一个线程调用 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 元素的用途是什么。我也不知道 AdditionalAssetAttributesSidecarFile 是什么。

谢谢!

【问题讨论】:

你在观察NSObjectsChangedInManagingContextNotification还是NSManagedObjectContextObjectsDidChangeNotification?您的问题是一个,但您的输出显示另一个。 我认为NSObjectsChangedInManagingContextNotificationNSManagedObjectContextObjectsDidChangeNotification 的值。 刚刚在这里尝试过:NSLog(@"%@", NSManagedObjectContextObjectsDidChangeNotification); 打印:NSObjectsChangedInManagingContextNotification 【参考方案1】:

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

【讨论】:

以上是关于从另一个线程调用 CoreData ContextObjectsDidChangeNotification的主要内容,如果未能解决你的问题,请参考以下文章

从另一个文件中调用一个Object

信号没有从另一个线程调用槽

从另一个线程调用 Boost 线程 Sleep_For()

C# 从另一个线程调用 form.show()

使用线程从另一个成员函数调用一个成员函数

如何使用线程从另一个类调用不同的函数