- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
iOS 上的 Core Data 有一些真正奇怪的行为。
我的主线程有一个 NSManagedObjectContext
,用于从 SQLLite 持久存储中读取数据并将其显示给用户。我还有一个由 NSOperationQueue
管理的后台进程。这些后台进程创建一个 NSMangedObjectContext
,从远程服务器获取数据,并将该数据保存到本地核心数据存储。
我已经注册了 NSManagedObjectContextDidSaveNotification
,当我收到这些通知时,我在主线程的 NSManagedObjectContext
上调用了 mergeChangesFromContextDidSaveNotification
(将通知对象作为参数)。
这都是非常标准的,也是所有 Core Data 文档建议您处理多线程的方式。
直到最近,我总是将新对象插入到数据存储中,而不是修改数据存储中的对象。这很好用。在后台线程写入新数据后,合并发生,我向 UIController 发送通知并重绘我的显示。显示正确绘制。
最近做了一个改动,后台线程既是插入又是修改对象。但是所有其余的模式都保持不变。现在合并后,我主线程的 NSManagedObjectContext
中的数据已损坏。如果我尝试查询对象,我将一无所获。如果我尝试检查我已经引用了它们所有关系的对象,则为 nil(不是故障而是 nil)。我检查了 SQLLite 数据库,数据都在那里。
唯一的解决方案似乎是重置 NSManagedObjectContext
,考虑到应用程序的架构,这是 Not Acceptable 。
好吧,最后一点奇怪。如果我的后台线程只更新属性(基元),那么我不会得到这种奇怪的行为。但是,如果我自己更新关系,那么我会得到这些空的提取请求结果和 nil'd out 关系。
我错过了什么?
最佳答案
好的,我想通了我的问题。我的问题是 mergeChangesFromContextDidSaveNotification
将更改从一个线程合并到另一个线程的方式。正如我多次阅读的那样,它不会回放您所做的更改,而是将最终状态合并在一起。我没有意识到这样做的后果。在我的后台线程中,我正在删除一个对象,但在我删除它之前我消除了它的一些关系,因为它们被标记为级联删除并且我不希望它们被删除。显然,当我将那些已删除的对象合并到主上下文中时,Core Data 仍然强制执行删除规则,并且级联删除主上下文中的相关对象。我更改了我的删除规则,现在我的关系不会被错误地消除。不幸的是,我有一种关系,在某些情况下我想删除级联,而在其他情况下我不想。我将不得不为此努力。
关于iphone - mergeChangesFromContextDidSaveNotification 后 CoreData 关系为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9423696/
我在创建几百个托管对象的单独线程中有一个托管对象上下文,当它保存时,将保存通知传递给主线程,并且我的其他上下文(在主线程上)被更新: 在线程 [ApplicationDelegate performS
我有两个 NSManagedObjectContext,一个用于 ui,一个用于后台任务。每当背景更改时,我都试图将更改合并到 UIcontext。但是每当我调用 mergeChangesFromCo
我正在创建一个addingManagedObjectContext 作为新实体的便笺簿区域,然后在“保存”时将新实体合并到我的主 ManagedObjectContext 中,类似于 CoreData
当我在内存类型 nsmanagementobjectcontext 中使用时,我的应用程序(osx 10.8.3)的内存大小有所增加: 波纹管是仪器的前 2 个函数。 我确实清除了内存问题,但泄漏仍然
我们一直在尝试调试 Core Data 多上下文/线程问题,其中将 Core Data 保存通知合并到我们的主线程 NSManagedObjectContext 偶尔会使应用程序崩溃。这导致大约 2%
我正在编写一个很大程度上基于 CoreData 的 iPad cooking 应用程序。 在我的应用程序中,我有一个用于编辑配方的屏幕,其中包含 2 种类型的信息: 带有配方类别\子类别和国家/地区的
在我的应用程序中,我调用服务器 API 来获取用户列表。我在带有 NSFetchedResultsController 的 UITableView 中显示这些用户。一些用户与当前连接的用户保持联系,而
我正在为一个更大的 iOS 应用程序编写一个 Core Data ContextManager。 ContextManager 提供一个 NSManagedContext,当其他 ContextMan
iOS 上的 Core Data 有一些真正奇怪的行为。 我的主线程有一个 NSManagedObjectContext,用于从 SQLLite 持久存储中读取数据并将其显示给用户。我还有一个由 NS
[编辑:问题的简化版本] mainMOC 是主要的托管对象上下文 editorMOC 是在 editorViewController 中创建的托管对象上下文,带有撤消管理器,因此用户可以编辑单个托管对
我正在使用 KVO 观察 NSManagedObject 的变化。我正在观察的 NSManagedObject 是主队列上 NSManagedObject 上下文的一部分。 当我在后台(私有(priv
我在我的应用程序中广泛使用 CoreData 来查看产品。所有数据同步都在单独的 NSManagedObjectContexts 后台完成,当更改同步完成时,我调用 mergeChangesFromC
我得到 uncaught exception 'NSObjectInaccessibleException', reason: 'CoreData could not fulfill a fault
我在 CoreData 中遇到了一些奇怪的行为,导致我的一个 MOC 最终处于不一致的状态。我在一个小样本中复制了这个问题 project 这是我的情况的基本概要: 我有两种实体类型,管道和盒子。每个
我正在使用私有(private)托管对象上下文在持久存储中创建一些新对象,然后在保存私有(private) MOC 后,使用 mergeChangesFromContextDidSaveNotific
一直在浏览与此类似的帖子,但没有一个回答我的问题。 与 CoreDataBooks 一样,我使用单独的 MOC 来添加和编辑项目并观察正确的通知,如下所示: - (void)addController
首先是背景: 我有一个单例,可以在上面做我所有与 CoreData 相关的事情。它被多个线程调用。对于每个线程,我始终使用相同的 StoreCoordinator 生成一个新的 MOC。我有两个 fe
好消息: 我从服务器下载数据,并通过 Core Data 线程限制保存数据,当后台 MOC 被保存时,主 MOC 被合并。 所有保存操作正常 此外,MOC 的合并没有任何问题 我正在寻找的错误: 当我
我有一个设置,在后台线程中我将新对象保存在 managedObjectContext A 中,在 TableViewController 中我听取 NSManagedObjectContextDidS
我正在使用后台线程执行一项长时间运行的任务,包括从服务中提取数据并通过 CoreData 将记录插入数据库。正如这里的许多答案所建议的那样,我正在观察 NSManagedObjectContextDi
我是一名优秀的程序员,十分优秀!