如何通过MVVM和RxSwift快速显示/隐藏progressHUD

用户名

我从MVVM开始,以便从视图中很好地分离逻辑代码。但是我有点担心在点击发出请求的按钮时将与progressHUD相关的代码放在哪里。

以前,我曾经这样做:

//Before 
@IBAction func startRequestTapped() {
   SVProgressHUD.show()
    self.apiClient.requestObservable().subscribe(onError: { (error) in
        SVProgressHUD.hide()                    
    }, onCompleted: { 
        SVProgressHUD.hide()                                        
    })
}

但是当我使用mvvm时,我会这样:

//In the viewModel
public var validateButtonDidTap = PublishSubject<Void>()
init() {
    validateButtonDidTap.flatMap { (_)
        return self.apiClient.requestObservable()
    }
}


   // In the viewController
viewDidLoad() {
    let tap = self.validateButton.rx.tap
    tap.bindTo(self.viewModel.validateButtonDidTap)
}

其中,我不知道将ProgressHUD隐藏或显示在何处。

XFreire

标记答案是正确的,但我将逐步指导您。

假设您要尝试登录。

  1. 在您的项目中复制ActivityIndi​​cator.swift文件

  2. viewModel

    //MARK: - Properties
    
    /// The http client
    private let apiClient: YourApiClient
    
    /// Clousure when button is tapped
    var didTappedButton: () -> Void = {}
    
    /// The user 
    var user: Observable<User>
    
    /// Is signing process in progress
    let signingIn: Observable<Bool> = ActivityIndicator().asObservable()
    
    //MARK: - Initialization
    
    init(client: YourApiClient) {
        self.client = client
    
        self.didTappedButton = { [weak self] in
            self.user = self.apiClient
                            .yourSignInRequest()
                            .trackActivity(self.signingIn)
                            .observeOn(MainScheduler.instance)
        }
    }
    
  3. 创建SVProgressHUD的扩展:(我不知道SVProgressHUD库,但是会是这样。请根据需要进行修复)

    extension Reactive where Base: SVProgressHUD {
    
        /// Bindable sink for `show()`, `hide()` methods.
        public static var isAnimating: UIBindingObserver<Base, Bool> {
            return UIBindingObserver(UIElement: self.base) { progressHUD, isVisible in
                if isVisible {
                    progressHUD.show() // or other show methods
                } else {
                    progressHUD.dismiss() // or other hide methods
                }
            }
        }
    
    }
    
  4. 在您的viewController

    @IBAction func startRequestTapped() {
        viewModel.didTappedButton()
    }
    
    override func viewDidLoad() {
    
        // ...
    
        viewModel.signingIn
                 .bindTo(SVProgressHUD.rx.isAnimating)
                 .addDisposableTo(disposeBag)
    }
    

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用CSS过渡快速显示和隐藏缓慢

如何快速显示和隐藏表格视图单元格

如何快速隐藏/显示按钮

快速显示和隐藏导航栏

如何通过单击按钮隐藏和显示表格?

如何通过单击HTML按钮隐藏和显示图像

如何通过动画以编程方式隐藏和显示WKInterfaceGroup?

如何通过脚本显示和隐藏标准的InDesign面板?

电子:如何通过按钮隐藏/显示<br />和<hr />?

使用RxSwift和MVVM显示活动指示器

如何隐藏和显示div

RxSwift练习显示/隐藏ActivityIndicator

通过单击按钮显示和隐藏div

通过按钮和JavaScript显示或隐藏div

传递数据MVVM和RxSwift

使用MVVM模式显示和隐藏进度条

如何使用BindingAdapter和android Mvvm在edittext中显示日期并通过datepicker更新日期

如何通过JavaScript显示隐藏的div?

jQuery如何快速显示元素而隐藏时间短

如何使用bootstrap-multiselect快速隐藏/显示选项?

如何隐藏所有窗口并快速显示桌面?

GCD和progressHUD

如何通过使用复选框在javascript图形中隐藏和显示我的数据系列

如何通过单击按钮在密码字段中显示和隐藏单词

如何切换多个隐藏字段以通过CSS和Javascript显示?

如何通过点击导航栏按钮来显示和隐藏tableView部分中的标题?

如何通过在选择表单中选择选项来隐藏和显示 div?

如何通过单击 C# 中的按钮来隐藏和显示面板

如何通过单击多个单选按钮来隐藏和显示div?