Код: Выделить всё
class BaseViewModel: ObservableObject {
typealias GHError = APIService.GHError
@Published var result = Resource.loading
let apiService = APIService()
init() {
refresh()
}
func getSuccessResult() async throws -> T? {
return nil
}
func refresh() {
result = Resource.loading
Task { @MainActor in
do {
if let successResult = try await getSuccessResult() {
result = Resource.success(successResult)
}
} catch GHError.invalidURL {
result = Resource.error("Invalid URL")
} catch GHError.invalidResponse {
result = Resource.error("Invalid response")
} catch GHError.invalidData {
result = Resource.error("Invalid data")
} catch {
result = Resource.error("Unexpected error")
}
}
}
enum Resource {
case loading
case success(T)
case error(String)
}
}
Код: Выделить всё
func getSuccessResult() async throws -> T? {
return nil
}
Код: Выделить всё
class GithubViewModel : BaseViewModel {
override func getSuccessResult() async throws -> [UserWrapper] {
async let following = apiService.getUsers(endPoint: Constants.followingEndPoint)
async let followers = apiService.getUsers(endPoint: Constants.followersEndPoint)
return try await UserWrapper.createUsers(following: following, followers: followers)
}
private struct Constants {
private static let endPoint = "https://api.github.com/users/alirezaeiii/"
static let followingEndPoint = endPoint + "following"
static let followersEndPoint = endPoint + "followers"
}
}
Было бы вы поможете мне своим комментарием, если есть какие-либо улучшения.
исходный код находится здесь: https://github.com/alirezaeiii/Github-U ... /tree/main
Подробнее здесь: https://stackoverflow.com/questions/791 ... sing-swift
Мобильная версия