1

我正在使用objective-c 开发一个全新的iphone 应用程序,我想确保它自下而上地构建福特坚韧。因为我有从头开始建造的奢侈。

向 json api 发出 http 请求并将数据存储在应用程序内进行操作的最有效方式(创建的最小内存占用)是什么?

4

1 回答 1

1

如果您的 Web 服务 API 支持 JSON,则使用 JSON。

JSON 解析器将解析 JSON 文本(从请求的响应数据中接收)并将其“转换”为相应的 Foundation 对象层次结构 - “表示”。这很容易实现,只需要几行代码。

根据您的描述,与网络相关的代码应该通过NSURLConnection使用委托方法来实现,这也是异步的。当您需要自定义身份验证和证书处理时,您必须使用委托方法。

对于中等规模的数据集,您当然可以选择可行的第三方网络库之一。它们也将支持自定义身份验证和证书处理。

关于您的问题如何处理数据:

一旦你拥有了代表你的资源的 Foundation 对象——例如,一个用户或用户列表等,你就可以使用这个 Foundation 对象并创建或更新你相应的“模型”。“模型”是您的“数据”的表示,例如用户或用户列表,通常是自定义类,可能是核心数据托管对象。

当数据“小”时,这种简单的方法几乎适用于所有用例。

当涉及“大型”数据集时,这种方法将不再适用。经验法则:为 Foundation 对象分配的内存量大约是 JSON 文本字节大小的 5 到 8 倍。例如,一个 30 MB 的 JSON 将需要大约 200 MB 的空间来表示。即使在现代设备上,这也可能会导致内存警告,因为还有其他分配。

处理“非常大”数据集的一种解决方案是以块的形式处理数据。也就是说,使用许多可能不同的专用专用“任务”,其工作负载只需要一个数据集。尽可能让这些任务并行运行。(我需要在这里停下来;))

为了持久化您的数据,您可以直接使用SQLite,或者您可能想要使用Core Data - 它使用 SQLite 作为后备存储。

如果你只是想从一个大型数据集的数据库中获取或插入对象,你可以考虑使用 SQLite——而不是出于性能原因使用 Core Data。

如果您对“模型”对象进行编辑、创建、删除、合并和搜索操作,这些操作将由用户通过 UI 执行,或者通过在 UI 中显示结果的其他任务执行,您将希望使用 Core Data。

注意:Core Data 不是数据库。

给第三方网络图书馆的一句话:

我还没有看到任何提供我希望在某些用例中具有的灵活性的方法。更重要的是,没有一个是“可扩展的”。也就是说,当您拥有大型数据集 (>10MByte) 时,您的应用程序开始变得次优 - 性能方面和内存占用量方面。对于大型和非常大的数据集,您的应用程序可能会阻塞。

这些库中的大多数会将整个响应数据累积在一个NSMutableData对象中,并且不会让您在收到的块到达时轻松处理它们。解决方法是使用临时文件 - 这需要在您的应用程序中添加额外的详细代码。请注意,在尝试解析 30 MB JSON 文件后,您可能会收到内存警告 - 通过 Wifi 传输需要 7 秒。

但是,拥有几 MBytes 范围内的数据集并不常见。

于 2013-09-10T09:39:57.617 回答