6

我们的应用程序必须以最少的远程 http 请求显示大量数据,因此我们在后端添加了一个端点,该端点以单个 json 响应的形式提供所有必要的数据。这会产生约 1.5MB(压缩)或大约 8MB 的未压缩 json 格式文本。

问题不大,它会在 10 到 30 秒内下载完毕,我们使用 ASIHTTPRequest 将整个响应写入磁盘。

现在是有趣的部分——在将未压缩的文件读入内存映射字符串后,我们使用 stig 的json-framework将其转换为 NSDictionary。这对于我们的应用程序的其余部分和我们其他 API 端点的典型 2 KB json 响应非常有效。但是,反序列化这 8 MB 的数据需要几秒钟(模拟器)到几分钟(3G 和第二代 iPod Touch)。

我正在研究读取所有这些数据的最佳方法。

我很想使用直接从后端提供的二进制 plist,但是我们使用的是 Java,我还没有找到适合我们要求的合适库,而且在如此紧迫的期限内,编写我们自己的可能不是最好的主意。

如果它有任何帮助,我们正在解析的 json 字符串主要是 X 项的数组,如下所示:

{
    "items": [ { "key1": "value1", "key2": "value2" },
               { "key1": "value1", "key2": "value2" },
               { "key1": "value1", "key2": "value2" },
               { "key1": "value1", "key2": "value2" },
               { "key1": "value1", "key2": "value2" },
               { "key1": "value1", "key2": "value2" }
             ]
}

将这个 8 MB json 格式的字符串读入内存中的 NSDictionary 的最有效方法是什么?

4

2 回答 2

7

看看JSONKit。它非常快,如果您的 JSON 有很多重复的键和值(这很常见),它的“最近实例化的对象缓存”将大大减少用于“最终”的内存量NSDictionary

于 2010-12-04T09:45:25.203 回答
2

虽然 JSONKit 比 YAJL 快,但 YAJL 支持解析流。您应该能够将其与 ASIHTTPRequest 连接起来,以便在下载 JSON对其进行解析。在此处查看标记为“在数据可用时进行文档样式解析”的部分:

http://gabriel.github.com/yajl-objc/

于 2010-12-20T02:13:29.080 回答