iOS 作业队列类似于 Path 的 android 优先级作业队列

Posted

技术标签:

【中文标题】iOS 作业队列类似于 Path 的 android 优先级作业队列【英文标题】:iOS job queue similar to Path's android priority job queue 【发布时间】:2014-07-09 17:53:05 【问题描述】:

是否有人拥有类似于Path's android Priority Job Queue 的 ios 作业队列,他们不介意与社区分享?我对 iOS 很陌生,所以我不确定平台本身是否提供这样的解决方案。在 android 上不存在这样的东西,所以我不得不使用 Path 慷慨提供的库。如果 iOS 本身或 Xcode 有这样的解决方案/API,请指点我。如果没有,请分享你的,如果你不介意的话。谢谢。

基本上,我正在寻找一个作业队列,即使在没有网络的情况下也可以允许用户将数据发送到服务器:这意味着即使用户应该关闭 iPhone,队列也会保留数据。然后在稍后的某个时间,当系统检测到网络时,将数据推送到服务器。

关于 SO 已经有一个类似的问题,因此我将其包括在内以获取更多详细信息:How to queue up data for server dispatch on android。不同的是,我的问题是针对 iOS 的,而他们的问题是针对 android 的。

用例

我的案例是假设用户在地铁(没有网络)上搭乘火车,但决定发送电子邮件。然后关闭应用程序,甚至关闭手机。然后一个小时后,用户重新打开手机后,当检测到网络时,应用程序会发送电子邮件。

【问题讨论】:

您是否查看过 Grand Central Dispatch? developer.apple.com/library/ios/documentation/Performance/… @BergQuester 我已经详细说明了我的问题。 Dispatch Queues iOS 提供仅用于异步。他们似乎没有将数据保存到文件系统,然后一直尝试发送它们,直到它们被发送。我错了吗?他们能否处理不利的网络连接问题:即保留数据并在有网络可用时进行调度? 我的问题冒犯了 2 个人,我深表歉意。但是请详细说明您为什么要关闭这个问题:也许我可以为您澄清;尤其是投反对票的人。 @KetedralPillon GCD 非常强大,有同步选项和跨队列协调选项。话虽如此,对于这个用例可能有更好的工具,例如 Aaron Brager 的 AFNetworking 解决方案。 【参考方案1】:

https://github.com/thisandagain/queue 很有前途。它具有重试能力并且是持久的。

【讨论】:

【参考方案2】:

AFNetworking 的请求操作和请求操作管理器可以修改为无需太多工作即可完成此操作。

需要修改:

AFHTTPRequestOperation 因无连接而失败时,复制操作并将其存储(例如,在NSArray 中) 使用内置的可达性管理器,当可达性返回时重试数组中的操作 如果操作成功,则从数组中删除操作

请注意,复制操作时不会复制完成块。来自文档:

-copy-copyWithZone: 使用原始的 NSURLRequest 返回一个新操作。因此,复制机制不会返回该特定时刻的操作的精确副本,而是返回一个全新的实例,这对于重试操作很有用。 操作的副本将不包括原始的outputStream。 操作副本不包括completionBlock,因为它通常会强烈捕获对self 的引用,否则在复制时会产生指向原始操作的不直观副作用。

我不知道有任何开源库已经实现了这些修改,或者我会指出你那里。

【讨论】:

感谢您的回复。我会调查AFNetworking 并报告。 +1。【参考方案3】:

我发现了非常相似的库,比如路径的作业优先级队列

https://github.com/lucas34/SwiftQueue/wiki

希望这对某人有所帮助,因为这是非常古老的问题,但可能会帮助仍在寻找像我这样的人:)

【讨论】:

以上是关于iOS 作业队列类似于 Path 的 android 优先级作业队列的主要内容,如果未能解决你的问题,请参考以下文章

如何查看延迟的作业队列?

Networkx 作为任务队列?

GCD 异步串行队列 - 可以限制队列大小?

Laravel 队列作业不加载文件

从 iOS 应用程序取消或刷新 AirPrint 作业

52任务计划管理