gpt4 book ai didi

iphone - 核心数据 - 在多个线程之间共享 NSManagedObjects

转载 作者:可可西里 更新时间:2023-11-01 04:16:28 25 4
gpt4 key购买 nike

我遭受了在多个线程中使用单个 MOC 的所有后果 - 我的应用程序在随机点崩溃,因为 MOC 是在主线程中创建的,我还使用它来填充另一个线程中的 DB。尽管代码是使用全局单例同步 (@synchronize) 的,但应用程序崩溃了。我读到过为每个线程使用单独的 MOC 可以解决问题,但我也读到过跨线程共享 NSManagedObjects 也被认为是一种不好的方法。

我的用例如下:1)我从服务器加载和解析 XML,在解析过程中我将每个新的 NSManagedObject 插入到数据库中。这一切都发生在一个单独的线程中。2) 用户从主线程与从数据库读取数据的 UI 进行交互。

在两个线程中我都使用 NSManagedObjects。你会如何建议我解决这个问题?我已经失败了很多次。

大多数情况下,应用程序会因错误而崩溃,提示我在枚举集合时正在修改它,但这是不正确的,因为代码是同步的,而在我迭代它时没有发生任何修改,反之亦然 - 当我修改它时我没有迭代并在完成后保存。

最佳答案

每个线程使用一个 NSManagedObjectContext。如果您在线程之间进行通信,请传递线程安全的 NSManagedObjectID,并再次从您的线程上下文中获取对象。在我的应用程序中,有时我什至为每个 Controller 使用一个上下文。

要管理不同的上下文,请为 NSManagedObjectContextDidChangeNotification 注册一个观察者。在此通知处理中,您通过 mergeChangesFromContextDidSaveNotification: 方法将通知传递给每个上下文。此方法是线程保存并使上下文更新其状态。

在此之后,您必须刷新您的 View 。如果您有基于 TableView 的应用程序,请查看 NSFetchedResultsController。这有助于您使用适当的动画自动更新表格。如果您不使用 TableView ,则必须自己实现 UI 更新。

关于iphone - 核心数据 - 在多个线程之间共享 NSManagedObjects,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12874492/

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