异步获取大量资源并将它们“异步”保存到数据库中。使用哪种好模式? (AFNetworking,核心数据)

Posted

技术标签:

【中文标题】异步获取大量资源并将它们“异步”保存到数据库中。使用哪种好模式? (AFNetworking,核心数据)【英文标题】:Get a number of resources asynchronously and "asynchronously" save them to a database. Which good pattern to use? (AFNetworking, Core Data) 【发布时间】:2012-10-08 23:34:08 【问题描述】:

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

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

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

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

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

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

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

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

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

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

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

谢谢!

【问题讨论】:

【参考方案1】:

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

作为替代方案,github 上有一个 thread-safe Core Data extension 可以为您执行此操作。如果你使用它,它会自动同步你的数据库操作,这样你就不必担心另一个线程是否正在处理上下文。你可以在它们进来的时候插入它们,框架会确保你的操作被翻译成不会让 Core Data 爆炸的东西。

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

【讨论】:

感谢您的回答。在尝试引导您的扩展程序之前,我将在那里打开一个关于管理 shared 上下文的问题。

以上是关于异步获取大量资源并将它们“异步”保存到数据库中。使用哪种好模式? (AFNetworking,核心数据)的主要内容,如果未能解决你的问题,请参考以下文章

Python:如何创建一个函数来从 url 获取数据并将其异步发送到其他位置?

在加入并将它们导出到 GCS 之前,如何等待 BigQuery 上的异步表写入?

Firebase 保存数据方法异步或同步

如何在异步调用期间填充数组并将其发送到响应对象中

如何等待异步函数的结果? [复制]

在nodejs中异步读取和缓存多个文件