【问题标题】:iOS: Download, unwrap, decode, and parse a large fileiOS:下载、解包、解码和解析大文件
【发布时间】:2011-06-25 18:45:34
【问题描述】:

我正在处理的一个项目(iPhone/Obj-C)要求我获取一个大文件(通过 HTTP Post)并处理它。服务器将返回一些 XML 包装 BASE64 编码的 gzip 压缩 XML 数据。即:服务器 -> XML -> BASE64 -> GZIP -> XML -> 我的模型

数据量会有所不同,但我听说最终的 XML 大约为 5 MB。

我想在数据到达时对其进行解包、解码和解析。

我正在寻找提示/指针。 (理想情况下,已有已发布的代码,但我在搜索中没有看到“流友好型”示例。)

我最终会继承 NSStream 吗?

理想的解决方案适用于运行 iOS 3.2 及更高版本的设备。

谢谢!

【问题讨论】:

    标签: xml ios stream gzip base64


    【解决方案1】:

    让服务器(Apache?)在 HTTP 中执行 gzip,iOS NSURLConnection 将在执行过程中解压缩 gzip。 HTTP 可以包含二进制数据,因此也不需要 Base64。您应该能够让 XML 以 NSData 的形式到达您的 NSURLConnection,您可以将其输入 SAX 类型解析器(可以在下载时解析)。

    如果您的服务器在您的控制之下,并且该服务器仅由 iOS 应用程序使用,并且性能是您主要关心的问题,您可以尝试发送编码为二进制 plist 的模型数据。不过 XML 或 JSON 可能会更容易使用。

    【讨论】:

    • 我正在与第 3 方服务器通话。不幸的是,我不能让他们发送为有效负载启用 gzip 的 XML。在项目的另一个领域,他们实际上在 ZIP 存档中向我发送了一堆 1-2 行 .txt 文件。是的,:(哇。
    【解决方案2】:

    嗯,这不是我提出的问题的答案,但也许是一个“解决方案”。

    我正在下载的数据非常适合内存,因此没有迫切需要优化内容以作为流处理。

    1. 我使用了不起的ASIHTTPRequest library (Ben Copsey) 来获取初始 XML,然后通过 NSXML 解析器运行它来获取标签。我强烈建议任何使用 iOS 的 HTTP 协议的人使用 ASI-HTTP-REQUEST。

    2. 接下来,我使用Matt Gallagher' Base64 category 的略微调整(以消除clang 警告)版本将Base64 解包为gzip。

    3. 然后我通过 ASI 的解码器运行 gzip 数据:NSData* xmlData = [ASIDataDecompressor uncompressData:gzippedData error:&error]; 以获取应该一直发送的 XML。

    4. 最后,我通过另一个 NSXMLParser 运行 XML 以挑选出我需要的数据位。

    在项目的另一部分,我实际上被指示获取包含数百个微小 .txt 文件的 ZIP 存档。 (是的,就是那种演出。)解码ZIP文件;我目前正在使用 Karl Moskowski 的 ZipKit

    我希望数据永远不会增长到需要将其全部作为流处理的程度。如果是这样,我知道一个简单的方法可以减少 33%。 :)

    【讨论】:

      猜你喜欢
      • 2014-10-24
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多