Swift:带有异步 Web 任务的活动指示器

Posted

技术标签:

【中文标题】Swift:带有异步 Web 任务的活动指示器【英文标题】:Swift: Activity Indicator with Async Web tasks 【发布时间】:2017-07-19 17:40:42 【问题描述】:

晚上我有以下问题:

问题

我的应用是基于网络的应用。它从 API 下载数据,您可以通过不同的tableViews 显示结果。

LandingPage 加载后,应用开始下载数据。数据通过许多异步任务下载。

我希望用户在数据全部下载之前不能使用该应用,并显示activity indicator

我想在页面加载后立即显示活动指示器,而不是在调用异步 closure 时停止它。

问题是,就像 5 个异步函数,每个异步任务都让其他异步任务。

那么有没有办法了解是否有异步任务正在运行,如果是:显示指标,如果没有:停止指标

或者,有更好的设计模式来实现这一点?

【问题讨论】:

研究使用DispatchGroup 请参阅***.com/questions/28100847/… 和其他类似问题。使用 Alamofire 是无关紧要的。使用实际异步任务所需的内容。 【参考方案1】:

由于你有很多异步,你应该使用 promise kit:

Promise Kit

有了它,您可以管理所有请求,甚至可以对每个请求执行不同的错误处理,并随时显示或隐藏加载指示符。

【讨论】:

谢谢你的回答。但我不想使用外部库 因此您可以实施“投票”,其中每个任务都有一票,当所有人都投票后,您可以隐藏您的 HUD。【参考方案2】:

解决方案

正如@rmaddy 建议的那样,我使用了GroupDispatch

首先,我创建了一个 GroupDispatch 对象

对于每个异步调用,我将groupDispatch 对象作为parameter 传递,并且在函数内部我使用了group.enter(),因此每次调用该函数时它都会进入组内。 在闭包中我使用了group.leave() 方法。

最后我使用group.notify 在所有异步调用完成时收到通知。

效果很好!

【讨论】:

以上是关于Swift:带有异步 Web 任务的活动指示器的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Swift在iOS 8上显示带有文本的活动指示器?

如何在 Swift 的多个视图中使用一个活动指示器?

将“活动指示器”添加到 TableView 并在 Swift 中恢复为“披露指示器”

如何使用 swift 在 WKWebView 的页面中间显示活动指示器?

在 swift 4 中使用 webkit 在 webView 中导航时创建活动指示器

带有自定义图像的活动指示器