RxSwift + Moya,端点请求实例?

问题描述

我正在尝试学习如何使用 MVVM 架构实例化端点请求,我接手了这个项目但没有构建它,这就是我不太了解它的原因。

一个层是端点

enum TrackingOptionsEndpoint {

    case getTrackingOptions
}

extension TrackingOptionsEndpoint: targettype,AccesstokenAuthorizable {

    var version: String {

        "v1"
    }

    var baseURL: URL {

        URL(string: Environment().configuration(PlistKey.serverURL))!
    }

    var path: String {

        switch self {

        case .getTrackingOptions:

            return "api/\(self.version)/trackingoptions/all"
        }
    }

    var method: Moya.Method {

        switch self {

        case .getTrackingOptions:
            return .get
        }
    }

    var task: Task {

        switch self {

        case .getTrackingOptions:
            return .requestPlain
        }
    }

    var headers: [String: String]? {
        ["Content-Type": "application/json"]
    }

    var authorizationType: AuthorizationType? {
        .bearer
    }

    var sampleData: Data {
        "".data(using: .utf8)!
    }
}

sedond 层是协议或存储库:

protocol TrackingOptionsRepositoryProtocol {
    func getCatalog() -> Observable<IBANResult<TrackingOptionsResponse>>
}
final class TrackingOptionsEndRepository: TrackingOptionsRepositoryProtocol,MoyaEndpointResolver {
    typealias T = TrackingOptionsEndpoint
    private let provider: MoyaProvider<T>
    private let plugins: [PluginType] = [Auth0Plugin(),InterceptorPlugin()]

    init() {
        self.provider = MoyaProvider<T>(requestClosure: TrackingOptionsEndRepository.endpointResolver(),plugins: self.plugins)
    }
}

// MARK: - Requests -

extension TrackingOptionsEndRepository {
    // MARK: - Card Activation Flow -

    func getCatalog() -> Observable<IBANResult<TrackingOptionsResponse>> {
        self.provider
            .rx
            .request(.getTrackingOptions)
            .map(EncapsulationResponse<TrackingOptionsResponse>.self)
            .map { $0.toResult() }
            .asObservable()
    }
}

模型或响应

struct TrackingOptionsResponse: Codable {
    let data : [DataInfo]
    let Meta : String
}

struct DataInfo : Codable {
    let id: String
    let verb: String
    let url: String
    let regex: String
    let isMovement: Bool
}

我试图用函数调用调用方法,但我不知道哪种方法是正确的,我向您展示和示例,尝试在 Splashviewmodel 中调用它,我尝试调用方法是 getTrackingOptionsIO

class SplashViewviewmodel: viewmodelType,Loadable {

    private let retrySubject: PublishSubject<Void> = PublishSubject<Void>()
    struct Input {
        let trigger: Driver<Void>
    }

    struct Output {
        let triggered: Driver<Void>
        let retrySubject: Driver<Void>
    }

    private let defaultsManager: UserDefaultsManager2.Type
    private let analyticsRepository: AnalyticsRepositoryProtocol
    private let trackingOptionsRepository: TrackingOptionsRepositoryProtocol
    init(coreDependencies: CoreProtocol) {
        
        self.defaultsManager = coreDependencies.userDefaultsManager2
        self.analyticsRepository = coreDependencies.analyticsRepository
        self.trackingOptionsRepository = coreDependencies.trackingsRepository
    }

    func transform(input: Input) -> Output {
        self.getTrackingOptionsIO()
        let retry: Driver<Void> = self.retrySubject.asDriverOnErrorJustComplete().flatMap { self.loadData() }

        let triggered = input.trigger
            .flatMap { self.loadData() }

        return Output(triggered: triggered,retrySubject: retry)
    }

    private func loadData() -> Driver<Void> {
        
        return Observable.combineLatest(self.getCustomerIOId(),self.loadRemoteConfigValue())
            .do(onNext: { _,result in

                if result {

                    Application.shared.applicationStateTrigger.onNext(.finishedLoadingInitialValues)
                    RemoteConfigValues.shared.startTimer()
                }

            },onError: { _ in

                if !Reachability.isConnectedToNetwork() { Reachability.displayNoConnectionErrorSnackBar(); return }

                Reachability.showSystemAlert(title: "error_occurred".localized(),with: "") { [weak self] in

                    self?.retrySubject.onNext(())
                }
            })
            .mapToVoid()
            .asDriver(onErrorJustReturn: ())
    }

    private func loadRemoteConfigValue() -> Observable<Bool> {

        RemoteConfigValues.shared.fetchAndActivateObservable()
            .flatMap { _ in Reachability.checkBuildVersionSanity() }
    }
    
     
    private func getTrackingOptionsIO() -> Observable<TrackingOptionsResponse> {
        return trackingOptionsRepository.getCatalog().map({ res in
            switch res {

            case let .success(res):


                return Observable<TrackingOptionsResponse>

            case let .failure(error):
                return Observable.error(IBANError.defaultError)
            }
        })
    }

    
    private func getCustomerIOId() -> Observable<String> {
        
        guard let analyticsId = self.defaultsManager.analyticsId else {

            guard let identifierId = UIDevice.current.identifierForvendor?.uuidString else {

                print("missing vendor identifier")
                return Observable.error(IBANError.defaultError)
            }

            return self.analyticsRepository.getAnalyticsId(externalId: identifierId).flatMap { result -> Observable<String> in

                switch result {

                case let .success(result):

                    guard let analyticsId = result?.analyticsId else {

                        return Observable.error(IBANError.defaultError)
                    }

                    return Observable.just(analyticsId)

                case let .failure(error):
                    return Observable.error(error)
                }

            }.do(onNext: { [weak self] analyticsId in

                print("AnalyticsId is \(analyticsId)")
                self?.defaultsManager.analyticsId = analyticsId
            })
        }

        print("AnalyticsId is \(analyticsId)")
        return Observable.just(analyticsId)
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)