2

我需要用注释填充我的地图。每个注释都有从远程服务器获取的相应 Place 资源。每个地方都有关联的类别 - 它也作为单独的资源从服务器获取。

假设要填充给定区域,我需要获取 100 个位置,每个位置属于 20 个类别之一(实际上还有更多)。

我使用 AFNetworking 来获取这两种资源。我尝试缓存地点和类别以供离线使用,因此在地图上显示注释之前,我将获取的资源写入核心数据表。

每个地方都按需求检索其关联的类别资源,我需要在“地方”表中写一个地方,在“类别”表中写一个类别。

由于获取是异步完成的,当将特定类别写入表时,我不知道是否可能另一个地方“线程”尝试将相同的关联类别写入“类别”表。

所以,问题是:当需要用异步检索的信息填充它们时,使用 Core Data 表的模式是什么?具体来说,任何要编写类别的给定线程如何知道已经有一个线程正在尝试这样做?

更新 1:我目前的问题是目前我有重复的类别。我的猜测是,显然每个尝试写入的类别都不知道同一类别的并行写入。

更新2:我的案例最简单的描述如下:

我在一个线程中创建了一个新的 Category 实体,其中包含一些字段,同时在另一个线程中,我创建了具有相同字段的完全相同的 Category 实体,旨在成为与第一个线程相同的 Category 对象。

一个线程赢得调用[managedObjectContext save:&error],但是在实际记录出现在 PersistentStore 之前,第二个线程也调用了保存。问题是:如何防止“类别”表中的记录重复?

更新 3:我正在考虑使用托管对象上下文的两种变体:1)所有线程重用一个共享 moc 实例 2)在每个线程上实例化一个新 moc

谢谢!

4

1 回答 1

2

“官方”答案将是关于使用NSOperationQueue和/或采取手动步骤以确保您对 的所有访问都NSManagedObjectContext发生在创建上下文的同一线程上。您可以遵循许多参考资料和教程来实施此方法。

作为替代方案,github 上有一个线程安全的 Core Data 扩展,可以为您执行此操作。如果你使用它,它会自动同步你的数据库操作,这样你就不必担心另一个线程是否正在处理上下文。您可以在它们进入时插入它们,该框架将确保您的操作被转换为不会使 Core Data 爆炸的东西。

完全披露:我建立了 github 项目。

于 2012-10-08T23:53:06.450 回答