问题描述
我正在尝试学习如何使用 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 (将#修改为@)