Код: Выделить всё
final class ItemDataSource {
private let modelContainer: ModelContainer
private let modelContext: ModelContext
@MainActor
static let shared = ItemDataSource()
@MainActor
private init() {
self.modelContainer = try! ModelContainer(for: UserEntity.self)
self.modelContext = modelContainer.mainContext
}
func append(user: UserEntity) {
modelContext.insert(user)
do {
try modelContext.save()
} catch {
fatalError(error.localizedDescription)
}
}
func fetch() -> [UserEntity] {
do {
return try modelContext.fetch(FetchDescriptor())
} catch {
fatalError(error.localizedDescription)
}
}
func delete() {
do {
try modelContext.delete(model: UserEntity.self)
} catch {
fatalError(error.localizedDescription)
}
}
}
Вот моя ViewModel:
Код: Выделить всё
class GithubViewModel: ObservableObject {
private let dataSource: ItemDataSource
private let networkService: NetworkService
@Published var viewState: ViewState = .loading
@Published var users: [UserEntity] = []
init(networkService: NetworkService, dataSource: ItemDataSource = ItemDataSource.shared) {
self.dataSource = dataSource
self.networkService = networkService
refresh()
}
func refresh() {
self.viewState = .loading
let userEntities = dataSource.fetch()
Task { @MainActor in
if(userEntities.isEmpty) {
do {
try await fetch()
} catch {
self.viewState = .failure(error: error)
}
} else {
self.users = dataSource.fetch()
self.viewState = .completed
do {
try await fetch()
} catch {
print(error.localizedDescription)
}
}
}
}
@MainActor
private func fetch() async throws {
let followingRequest = GithubRequest(path: .following)
let users: [UserDTO] = try await networkService.perform(request: followingRequest)
dataSource.delete()
for user in users {
let userEntity = UserEntity(from: user)
dataSource.append(user: userEntity)
}
self.users = dataSource.fetch()
self.viewState = .completed
}
}
Код: Выделить всё
Main actor-isolated static property 'shared' can not be referenced from a non-isolated context; this is an error in Swift 6
Полный исходный код можно найти: https://github.com/ alirezaeiii/CachingSwiftData
Подробнее здесь: https://stackoverflow.com/questions/792 ... m-a-non-is
Мобильная версия