На основное статическое свойство, изолированное от актера, «shared» нельзя ссылаться из неизолированного контекста [закрIOS

Программируем под IOS
Ответить
Anonymous
 На основное статическое свойство, изолированное от актера, «shared» нельзя ссылаться из неизолированного контекста [закр

Сообщение Anonymous »

Я новичок в разработке iOS. Я пытаюсь разработать архитектуру MVVM, используя SwiftData для кэширования. Я создал источник данных элемента следующим образом:

Код: Выделить всё

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)
}
}
}
Я пытался использовать для этого шаблон Singleton. У вас есть лучшее предложение?
Вот моя 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
}
}
Отображается предупреждение для ItemDataSource.shared:

Код: Выделить всё

Main actor-isolated static property 'shared' can not be referenced from a non-isolated context; this is an error in Swift 6
Как исправить это предупреждение, если я использую шаблон проектирования Singleton?
Полный исходный код можно найти: https://github.com/ alirezaeiii/CachingSwiftData

Подробнее здесь: https://stackoverflow.com/questions/792 ... m-a-non-is
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»