2017-09-04 123 views
0

我正在使用Xamarin.iOS并实施Downloadmanager。Xamarin.iOS下载管理器

我发现了一个关于如何在swift中实现DownloadManager的教程,由该教程领导,我已经将用swift编写的逻辑转录到C#中。 DownloadManager工作并排队操作并执行它们。我面临的唯一问题是应用程序转换到暂停模式。队列的行为不是那么确定的。有时候,所有排队的操作都会执行,有时应用会停止执行。

使用案例1: 我开始文件同步并锁定iPad。大部分时间排队的操作被执行。但有时当我解锁iPad时,应用程序将发送到后台,我必须双击主页按钮才能返回到应用程序,在这种情况下,文件同步在执行过程中以某种方式停止。

使用案例2:我开始文件同步并将应用程序发送到后台。像以前的用例一样。有时会执行所有操作,有时操作会停止。

使用案例3:客户开始同步并且在他回来一段时间后,iPad无人照看,同步未完成且应用程序在后台。平均约有70%的同步完成。

对于实现,我使用了“DownloadOperation”作为元素的“NSOperationQueue”。 “DownloadOperation”只是NSOperation对象的包装,其执行设置为“异步”。

可能的问题

  • 我不知道会发生什么情况“NSOperationQueue”应用程序改变状态的时候?
  • “NSOperationQueue”的用法是“正确”的方式去执行DownloadManager吗?
  • 是否有针对“NSOperationQueue”和/或“的NSOperation”

的执行展望讨论的优化任何常见的提示。

P.S.我已启用“背景模式”和“背景获取”

+0

我认为你只需要一个取消触发器,你可以为任务做这件事,不确定关于NSOperationQueues。如果可以实现cancallation触发器,您将知道操作是否停止,以及应用程序重新加载的时间是否能够相应处理。 – Digitalsa1nt

+0

@ Digitalsa1nt我不想取消操作,我希望它们在应用程序终止后继续执行。这就是在NSOperations中使用OperationQueue和NSUrlSession的原因。但是,谢谢你的评论我希望有人对此问题有所了解。 –

+0

在iOS终止您的应用程序后,您无法让代码无限期地运行。或者我应该说这是违反苹果准则的。希望有人会为你找到解决办法。 :) – Digitalsa1nt

回答

0

根据您的描述,我想您使用NSURLConnection来执行不赞成使用的后台下载。此外,Background Fetch是少量的内容,这将是活跃的投机,这是不适合您的方案:

抓取内容的少量投机

应用程序需要检查是否有新内容定期可以要求系统将其唤醒,以便他们可以启动该内容的获取操作。

所以,你可以切换使用NSURLSession这是正式建议在后台下载内容。要配置后台会话,下载过程将继续进行,以防应用程序被暂停或终止(除非用户已强制该应用程序)。请参阅本Apple documentation

在后台

下载内容在下载文件,应用程序应该使用NSURLSession对象,启动下载,以便系统可以利用下载过程的控制的情况下,该应用程序被暂停或终止。当您为后台传输配置NSURLSession对象时,系统会在单独的进程中管理这些传输,并以通常的方式将状态报告回您的应用程序。如果您的应用在传输过程中被终止,系统将在后台继续传输,并在传输完成时或者一个或多个任务需要应用关注时启动您的应用(如适用)。

...

如果任务还没有完成,系统终止您的应用程序时,系统将自动继续管理后台任务。如果用户终止您的应用程序,系统将取消所有未完成的任务。

关于如何通过NSURLSession创造背景下载管理器,你可以参考一下:

博客与SWIFT:Downloading files in background with URLSessionDownloadTask

Xamarin指导:Walkthrough - Using Background Transfer Service and NSURLSession

我认为你需要下载多个文件在后台,这里有一个很好的指导:Downloading multiple files in batches in iOS

+0

我已经用“NSURLSession”实现了整个Manager。简而言之,我使用NSOperations创建了一个NSOperationQueue,其中每个操作都有一个由DownloadManager的基本NSURLSession创建的NSURLSessionDownloadTask。 即使应用程序暂停,这应该可以下载多个文件。 我已经使用这篇文章作为参考 - > [链接](https://stackoverflow.com/questions/32322386/how-to-download-multiple-files-sequentially-using-nsurlsession-downloadtask-in-s ) –