【问题标题】:Xamarin.iOS Download ManagerXamarin.iOS 下载管理器
【发布时间】:2017-09-04 14:36:58
【问题描述】:

我正在使用 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.我已启用“后台模式”和“后台获取”

【问题讨论】:

  • 我认为您只需要一个取消触发器,您可以为任务执行此操作,不确定 NSOperationQueues。如果可以实现取消调用触发器,您就会知道操作是否停止,以及应用重新加载时能够相应地处理它。
  • @Digitalsa1nt 我不想取消操作,我希望它们在应用程序终止后继续执行。这就是将 OperationQueue 和 NSUrlSession 与 NSOperations 一起使用的原因。但是感谢您的评论,我希望有人对这个问题有所了解。
  • 在 iOS 终止您的应用程序后,您不能让代码无限期地运行。或者我应该说这样做违反了苹果的指导方针。希望有人会为您找到工作。 :)
  • @Digitalsa1nt 嗯,这有点令人困惑,因为在关于如何实现下载管理器的指南中,他们说下载/上传操作应该由系统处理,实现这些事情的方法是使用 OperationQueue 和 NSUrlSession。我的意思是像 DropBox 或 gDrive 这样的提供商如何实现这些东西会很好,因为他们必须同步他们的数据。我也希望能找到一些东西。祝你有美好的一天:D

标签: c# ios xamarin.ios nsoperation nsoperationqueue


【解决方案1】:

根据您的描述,我想您使用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

【讨论】:

  • 我已经用“NSURLSession”实现了整个管理器。简而言之,我使用 NSOperations 创建了一个 NSOperationQueue,其中每个操作都有一个由 DownloadManager 的基本 NSURLSession 创建的 NSURLSessionDownloadTask。即使应用程序暂停,这也应该能够下载多个文件。我以这篇文章作为参考 --> link
猜你喜欢
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 1970-01-01
  • 2020-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多