我正在处理的项目(iPhone / Obj-C)要求我获取一个大文件(通过HTTP Post)并处理它。服务器将返回一些XML包装BASE64编码的gzip压缩XML数据。即:SERVER - > XML - > BASE64 - > GZIP - > XML - >我的模特
数据量会有所不同,但我被告知最终的XML大约为5 MB。
我想在数据到达时解包,解码和解析。
我正在寻找提示/指针。 (理想情况下,现有已发布的代码,但我在搜索中没有看到“流友好”的例子。)
我最终会继承子类NSStream吗?
理想的解决方案适用于运行iOS 3.2及更高版本的设备。
谢谢!
答案 0 :(得分:1)
让服务器(Apache?)在HTTP中执行gzip,并且iOS NSURLConnection将随时取消gzip。 HTTP可以包含二进制数据,因此也不需要Base64。您应该能够将XML作为NSData到达NSURLConnection,您可以将其提供给SAX类型解析器(可以在下载时解析)。
如果您的服务器在您的控制之下,并且该服务器仅由iOS应用程序使用,并且性能是您主要关注的问题,则可以尝试将编码为二进制plist的模型数据发送。但是,XML或JSON可能更容易使用。
答案 1 :(得分:1)
嗯,这不是我问的问题的答案,但也许是“解决方案”。
我正在下载的数据非常适合内存,因此没有必要优化要作为流处理的内容。
我使用精彩的ASIHTTPRequest library(Ben Copsey)来获取初始XML,然后通过NSXML解析器运行它来获取标记。对于使用iOS的HTTP协议的人,我强烈推荐ASI-HTTP-REQUEST。
接下来,我使用稍微调整(去除铿锵警告)版本Matt Gallagher' Base64 category将Base64解包到gzip。
然后我通过ASI的解码器运行gzip数据:NSData* xmlData = [ASIDataDecompressor uncompressData:gzippedData error:&error];
以获取应该一直发送的XML。
最后,我通过另一个NSXMLParser运行XML来挑选我需要的数据。
在项目的另一部分,我实际上是指示获取包含几百个.txt文件的ZIP存档。 (是的,这就是那种演出。)解码ZIP文件;我目前正在使用Karl Moskowski的ZipKit。
我希望数据永远不会增长到我需要将其全部作为流处理的程度。如果确实如此,我知道一个简单的方法可以削减33%。 :)