【问题标题】:Making Api call on View DidLoad with MVVM swift使用 MVVM swift 对 View DidLoad 进行 Api 调用
【发布时间】:2019-10-17 13:52:47
【问题描述】:

我有一个应用程序,我想在 ViewController 中唤醒屏幕后进行 API 调用。基本上,我使用通用链接来激活 ViewCONtroller,当它显示 UIViewController 时,我想根据获得的数据进行 API 调用。我目前正在使用 MVVM 架构,并在下面添加了我的代码

我的视图模型

    class EmailVerificationViewModel: ViewModel, ViewModelType {

        struct Input {
            let editEmailTrigger: Driver<Void>
        }

        struct Output {

        }

        let routeManager: BehaviorRelay<RouteMatchResult?>
        let currentEmail: BehaviorRelay<String?>

        init(routeManager: RouteMatchResult?, provider: Api, currentEmail: String?) {
            self.routeManager = BehaviorRelay(value: routeManager)
            self.currentEmail = BehaviorRelay(value: currentEmail)
            super.init(provider: provider)
        }

        func transform(input: Input) -> Output {

         // THE CALL I WANT TO MAKE
            routeManager.errorOnNil().asObservable()

            .flatMapLatest { (code) -> Observable<RxSwift.Event<User>> in
            log("=========++++++++++++==========")
//            guard let code = code else {return}
            let params = code.values
                let challengeId = Int(params["xxx"] as? String ?? "0")
                let login = LoginResponseModel(identifier: params["xxxx"] as? String, key: params["xxxxxx"] as? String, oth: params["xxxxx"] as? String, id: 0, challengeId: challengeId)

            return self.provider.postVerifyApp(challengeId: login.challengeId!, oth: login.oth!, identifier: login.identifier!)
            .trackActivity(self.loading)
            .trackError(self.error)
            .materialize()
        }.subscribe(onNext: { [weak self] (event) in
            switch event {
            case .next(let token):
                log(token)
                AuthManager.setToken(token: token)
//                self?.tokenSaved.onNext(())
            case .error(let error):
                log(error.localizedDescription)
            default: break
            }
        }).disposed(by: rx.disposeBag)

            return Output()
        }
    }

我的视图控制器

override func bindViewModel() {
        super.bindViewModel()
        guard let viewModel = viewModel as? EmailVerificationViewModel else { return }

        let input = EmailVerificationViewModel.Input(editEmailTrigger: editEmailBtn.rx.tap.asDriver())
        let output = viewModel.transform(input: input)

        viewModel.loading.asObservable().bind(to: isLoading).disposed(by: rx.disposeBag)
        viewModel.parsedError.asObservable().bind(to: error).disposed(by: rx.disposeBag)

        isLoading.asDriver().drive(onNext: { [weak self] (isLoading) in
            isLoading ? self?.startAnimating() : self?.stopAnimating()
        }).disposed(by: rx.disposeBag)


        error.subscribe(onNext: { [weak self] (error) in
            var title = ""
            var description = ""
            let image = R.image.icon_toast_warning()
            switch error {
            case .serverError(let response):
                title = response.message ?? ""
            }
            self?.view.makeToast(description, title: title, image: image)
        }).disposed(by: rx.disposeBag)
    }

所以一旦应用程序捕获通用链接并加载,我如何才能对THE CALL I WANT TO MAKE 之类的评论进行调用。基本上是在 viewDidLoad 上进行 API 调用

【问题讨论】:

  • 您能否编辑问题以包括您遇到的问题是什么,到目前为止您尝试了什么以及没有什么效果?那太好了,至于我看到您的问题,您希望实现的目标有多种解释...
  • 好的@denis_lor 完成了编辑检查它现在

标签: ios swift rx-swift


【解决方案1】:

您的示例中的代码远远超出了回答问题所需的范围。以下是在 viewDidLoad 上进行网络调用的方法:

class ViewController: UIViewController {

    var viewModel: ViewModel!

    private let disposeBag = DisposeBag()

    override func viewDidLoad() {
        super.viewDidLoad()

        let input = ViewModel.Input()
        let output = viewModel.transform(input: input)
        output.viewData
            .bind(onNext: { viewData in
                // setup the view with viewData
            })
            .disposed(by: disposeBag)
    }
}

class ViewModel {
    struct Input { }
    struct Output {
        let viewData: Observable<ViewData>
    }

    init(api: API) {
        self.api = api
    }

    func transform(input: Input) -> Output {
        let viewData = api.networkCall()
            .map { ViewData(from: $0) }
        return Output(viewData: viewData)
    }

    let api: API
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-10
    • 2011-01-21
    • 2015-07-10
    • 2018-01-16
    • 1970-01-01
    • 2021-10-09
    • 2011-05-12
    • 2019-04-06
    相关资源
    最近更新 更多