feat: feature 多模块骨架
This commit is contained in:
34
IosClientKit/Sources/FeatureHome/HomeViewModel.swift
Normal file
34
IosClientKit/Sources/FeatureHome/HomeViewModel.swift
Normal file
@@ -0,0 +1,34 @@
|
||||
import CoreDomain
|
||||
import CoreModel
|
||||
import Observation
|
||||
|
||||
@MainActor
|
||||
@Observable
|
||||
public final class HomeViewModel {
|
||||
public private(set) var uiState: HomeUiState = .loading
|
||||
|
||||
private let homeUseCase: HomeUseCase
|
||||
private var loadTask: Task<Void, Never>?
|
||||
|
||||
public init(homeUseCase: HomeUseCase) {
|
||||
self.homeUseCase = homeUseCase
|
||||
}
|
||||
|
||||
public func load() {
|
||||
// flatMapLatest 的等价:新 load 前先取消旧的观察。
|
||||
loadTask?.cancel()
|
||||
loadTask = Task { [weak self] in
|
||||
guard let self else { return }
|
||||
self.uiState = .loading
|
||||
do {
|
||||
for try await data in self.homeUseCase.observeHome() {
|
||||
self.uiState = data.habits.isEmpty ? .empty : .success(data)
|
||||
}
|
||||
} catch is CancellationError {
|
||||
// 被更新的 load() 取代,保持当前状态即可。
|
||||
} catch {
|
||||
self.uiState = .error(error.localizedDescription)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user