在 Swift 中使用协议的加载器

Posted

技术标签:

【中文标题】在 Swift 中使用协议的加载器【英文标题】:Loader using Protocol in Swift 【发布时间】:2021-12-31 05:17:39 【问题描述】:

我想为视图控制器使用协议只是为了显示和隐藏加载器。在这部分我是成功的。但是如果加载器函数已经显示加载器,我想限制它的执行。

我为 API 请求调用 showLoader 函数。而且我不想隐藏加载程序,直到所有请求都得到响应。如果我将计数变量用作静态变量,我可以实现这一点吗?或者有没有其他方法可以在没有计数的情况下实现这一目标?甚至可能与否,请告知。

protocol Loader where Self: UIViewController 
    func showLoader()
    func hideLoader()


extension Loader 
    func showLoader() 
        if count == 0 
            print("Show Loading")
        
        count += 1
    

    func hideLoader() 
        count -= 1
        if count < 1 
            count = 0
            print("Hide Loading")
        
    

【问题讨论】:

问题是什么?在哪里声明count count 成为协议的一部分? 我为您的问题编辑了更多内容。 @jnpdx “将 count 变量用作静态变量”——这真的是您想要的吗?或者,您只是想知道如何像@JoakimDanielson 建议的那样制作协议的可变部分? I would like to use the count variable as static 看起来像XY Problem。似乎您只需要一个计数器,它会根据showLoader/hideLoader 调用增加和减少,并根据计数器值显示/隐藏加载视图。尚不清楚为什么您需要一个协议,您能否向我们展示一些代码示例,说明您打算如何使用它,假设它有效? 【参考方案1】:

我认为你真的不需要关心这个。如果已经存在加载器,则可以在内部处理一个类,方法是在显示之前将其删除。

class Loader 
    // This is your view which can contain an animation or just the spinner
    private static var activityView: LoaderView!

    static func showLoader(onView view: UIView) 
        removeLoader()
        // The params are frame and superview
        activityView = LoaderView(with: view.bounds, view)
        view.addSubview(activityView)
        UIView.animate(withDuration: 0.25) 
            activityView.alpha = 1.0
        
    

    static func removeLoader() 
        UIView.animate(withDuration: 0.25) 
            // if exists it will be removed, if not is nil and nothing will happened.
            activityView?.removeFromSuperview()
        
    

【讨论】:

我已经在使用加载器的基类了。但我正试图通过协议来实现这一点。

以上是关于在 Swift 中使用协议的加载器的主要内容,如果未能解决你的问题,请参考以下文章

在Swift中加载UICollectionView时的加载器/微调器

重新加载uitableviewcell,iOs / Swift时随机滚动

swift 加载微调器

为啥视频没有播放,只在 swift 中显示加载程序

为啥我不能使用 Swift 4 加载 Collada 文件?

iOS Swift5.0 WKWebView使用JS与Swift交互