【问题标题】:MonoTouch: How to save a huge PDF downloaded from an URL incrementally?MonoTouch:如何以增量方式保存从 URL 下载的巨大 PDF?
【发布时间】:2011-12-29 10:26:43
【问题描述】:

我需要从我的 MonoTouch iPhone/iPad 报亭应用中的 URL 下载一个巨大的 PDF 文件。

PDF 太大而无法放入内存,所以我需要使用 NSData 逐步保存它。

我的想法如下:不是将所有下载的数据附加到 NSData 中,而是在下载的最后,当我获得所有数据时,将其存储到一个文件中,我想在单独的文件中异步执行下载线程并将每个接收到的块附加到文件并释放我的内存,但请确保如果连接断开或应用程序崩溃,下载将自动从最后一个块恢复而不会损坏文件。

你有什么建议?有没有更好的方法?我如何在 MonoTouch 中做到这一点?我在 Xamarin 网站上没有找到任何关于 iOS 增量下载/恢复的文档或代码示例。

【问题讨论】:

  • 我认为您需要研究如何在普通的旧 .Net/C# 中执行此操作。它在 windows 上应该和 MonoTouch 中的一样。
  • 我正在尝试遵循 Apple 的 Newsstand 演示文稿幻灯片(“Building Newsstand Apps”,Session 504)所指示的指导方针。我只是想了解 MonoTouch 中的 C# 代码与幻灯片中显示的 Obj-C 中的代码是等价的。您确定标准的 .NET 方式是处理此问题的正确方式吗?或者我是否有可能看到我的应用被 Apple 拒绝?谢谢。

标签: ios xamarin.ios download nsdata


【解决方案1】:

你不需要NSData 或来自 ObjC 的任何东西。 您可以使用WebClient (http://msdn.microsoft.com/en-us/library/system.net.webclient.aspx) 在纯 C# 中实现此目的。 有关带进度条的分块下载示例,请参见此处:http://devtoolshed.com/content/c-download-file-progress-bar

【讨论】:

  • 您链接的文章似乎没有按照我的要求做,即使是经典的 C#/.NET 方式也是如此。来自一条评论:“看这里的代码,除了小文件之外,这将完全不适合任何东西,因为它会创建一个文件大小的字节数组,这会导致内存使用非常糟糕。很好的示例代码,但对于真正使用的任何人来说都是如此代码应该实现一个固定大小的缓冲区并将缓冲区刷新到文件中并重用它来获取下一个数据块。”也不推荐在 MonoTouch 上使用 WebClient(请参阅:escoz.com/blog/webclient-reliability-problems-under-monotouch)。
  • 评论来自2010年11月!是的,Monotouch/Mono 在网络堆栈中存在问题,但问题已得到解决,正如 Migueal 所说:WebClient 是要使用的东西。如果你想如此严格地遵守 Apple 的指导方针,你将不得不使用 ObjC。只是我的 2 美分。
【解决方案2】:

您可以使用 System.Net.WebClient 并使用 DownloadFile 方法,该方法会将数据从 HTTP 流式传输到磁盘,而无需将其保存在内存中。

【讨论】:

  • Apple 的 Newsstand 演示幻灯片(“Building Newsstand Apps”,Session 504)推荐使用 NSURLConnection Delegate 和 NKAssetDownload 来下载和恢复报亭内容。遵循这些准则更好还是没有区别?谢谢!
  • 我没有看过那个演讲,只是回答了最初的问题。您应该将此作为后续问题发布。
  • 好的,我发了一个后续问题:stackoverflow.com/questions/8688197/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多