gpt4 book ai didi

ios - 如何在 swift 中使用 MVVM 和 RxSwift 显示/隐藏 progressHUD

转载 作者:搜寻专家 更新时间:2023-10-30 22:21:34 25 4
gpt4 key购买 nike

我从 MVVM 开始,以便很好地将逻辑代码与 View 分开。但是我担心在点击发出请求的按钮时将 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 隐藏或显示在哪里。

最佳答案

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

假设您要尝试登录。

  1. 复制 ActivityIndicator.swift file在你的项目中。

  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)
    }

关于ios - 如何在 swift 中使用 MVVM 和 RxSwift 显示/隐藏 progressHUD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41932734/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com