在 iOS 上处理 Core Data 数据库的频繁更新和请求的最佳实践?

Posted

技术标签:

【中文标题】在 iOS 上处理 Core Data 数据库的频繁更新和请求的最佳实践?【英文标题】:Best practice to deal with frequent updates and requests on a Core Data database on iOS? 【发布时间】:2011-12-05 18:07:39 【问题描述】:

我正在构建一个应用程序,它需要从许多 http 源收集数据。有时,这些源的计数最终可能为 700,总共 35 MB。

为了避免每次需要时都下载数据并避免向用户收取巨额费用,我认为最好将结果存储到 SQLite Core Data 数据库中,在第一次通过后,然后执行根据需要在本地请求。

我并没有寻找在存储下载数据时避免崩溃的最佳方法。我使用最多 7 个 http 同时请求的操作队列下载数据,我担心同时从 2 个线程访问相同的托管对象上下文时可能会遇到崩溃,因为我们正在讨论存储在数据库中的物理磁盘访问,事情可能会变得复杂。

我只是想知道存储这些类型的数据然后在其中执行快速搜索的良好做法,而不会让您的应用程序由于多线程问题而一直崩溃。

提前谢谢你。

【问题讨论】:

【参考方案1】:

您不应有 2 个线程访问同一个 NSManagedObjectContext。每个线程都应该有自己的NSManagedObjectContext,并且您应该在必要时使用mergeChangesFromContextDidSaveNotification: 合并上下文。多线程和核心数据可能很棘手,因此您需要跨越所有 T 并在此上点出所有 I,但这应该是可能的。 ios5 为 NSManagedObjectContext 带来了一些更好的多线程支持,带有锁定等,但我不熟悉它尚未详细说明,但如果您的目标是 iOS5,请查看类参考的 Managing Concurrency 部分,之前的任何内容iOS5 你需要有多个 MOC。

另外,我相信当在蜂窝网络上时,iOS 将设备限制为同时最多有 2 个并发 HTTP 请求。

【讨论】:

谢谢。 2 个并发 HTTP 请求?你有这个链接吗?如果我有一个最多有 4 个并发保持操作的操作队列会发生什么? 所以我猜实际上是移动网络有这个限制。 “大多数移动网络 (3G) 不允许来自给定 IP 地址的两个以上并发 HTTP 连接。也就是说,从您的设备上,您不能在 3G 网络上打开两个以上并发 HTTP 连接。Edge 更糟糕。你在大多数情况下,不能打开多个连接。在传统的家庭宽带 (Wifi) 上,这个限制相当高(六个)。在这里找到。 blog.mugunthkumar.com/products/…不确定有效性。 关于它是否有最多 2 个并且您有 4 个计划,我会假设(如果网络库足够聪明)它会将这些额外的请求保留在队列中,直到它们可以被处理。 这是一个很大的“如果”。我将在希腊测试这个的有效性,尽管我不相信 2 个 HTTP 连接限制是真实的。我最近开发了一个应用程序,它在打开 XMPP 连接的同时执行 http 请求。为什么 HTTP 的行为应该不同? 这是一个很大的“如果”,我知道大多数 HTTP 服务器会限制您可以拥有的并发连接数,但是由于您要处理多个服务器,所以在这里应该没问题。我无法对此进行测试。不熟悉 XMPP,无论哪种方式,如果有限制,如果它不是限制所有协议的通用连接池,那将是没有意义的。

以上是关于在 iOS 上处理 Core Data 数据库的频繁更新和请求的最佳实践?的主要内容,如果未能解决你的问题,请参考以下文章

RESTkit,Core Data:在将对象传输到 Core Data 之前对其进行处理

iOS 上 Core Data 结合 FMDB

Core Data 可以在 iOS 上延迟获取 BLOB 属性吗?

iOS NSArray, NSSet 与 Core Data Query (Fetch Request)

Core Data 可以在 iOS 上提供哪些(如果有)ACID 保证?

iOS Core Data Predicate 用于根据相关数据进行过滤