使用单独的线程从服务器下载大量数据

时间:2013-01-18 12:27:49

标签: iphone

我们正在构建一个iPhone应用程序,我们遇到了在后台下载应用程序内购买的问题,我想知道是否有人有解决方案......

我们的应用内购买量非常大35-40mb,每次购买包含5个项目,每个7-8mb,因此手机通常会进入待机状态,或者用户在下载购买之前切换应用程序,因此这对于应用程序来说非常重要购买是在后台无缝下载的。

当我们下载购买时,我们必须从服务器下载大约35-40mb并同时更新应用程序中的本地sqlite数据库。我们已经测试了在前台下载项目并且工作正常,我们已经做了一些处理以保持下载过程在后台继续,下载仍在继续,我们可以看到它在调试器中工作。

但是我们有以下问题......

用户开始下载 应用程序上的下载页面显示应用程序正在下载 用户离开应用或手机进入待机状态 用户返回应用

此时,应用程序启动画面会加载并停留在屏幕上,直到其中一个8mb下载完成,完成后再切换到应用程序上的下载页面。这对用户来说真的很困惑,因为他们认为应用程序崩溃了。

那么我们如何管理应用程序内购买,以便在用户按下下载时在后台启动下载,并且在下载过程中应用程序正常运行?因此用户离开应用程序,当它们返回时,它会显示包含下载进度的正确页面。用户在应用内导航,工作正常。

一些观察......

我必须连续五次运行NSURLConnection才能执行下载,因为每个应用内购买都有5个项目。

我注意到的事情是,当第一次下载正在进行时,即使用户按下主页按钮,也不会调用“didEnterBackground”方法,但是在第一次下载过程完成后,“didEnterBackground”方法会被调用。如果用户将应用程序放入后台然后返回到前台,则应该调用“didEnterForeground”,但不是。

我使用不同的线程然后“MainThread”下载数据,但仍然运行相同的问题。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

  • 看看AFNetworking它被许多人使用并加载到不同的线程上。在readme中有一个文件下载进度示例。
  • 您可以阻止iOS在下载过程中进入待机状态:

    [UIApplication sharedApplication].idleTimerDisabled = YES;
    

答案 1 :(得分:0)

尝试查看......新的AFNetworking'extension AFDownloadRequestOperation

这个类有额外的支持来恢复部分下载,使用临时目录并有一个特殊的块来帮助计算正确的下载进度等等。

“别忘了将shouldResume设置为YES”:)

对于AFDownloadRequestOperation,您还可以查看此AFNetworking not resuming download

<强> UPD

在更糟糕的情况下..您可以在后台尝试"Task Completion for Long-Running Tasks""Task-Specific Background Processing" .. http://www.codeproject.com/Articles/124159/Hour-21-Building-Background-Aware-Applications