Почему ObservableObject показывает «Публикация изменений из фоновых потоков не разрешена», а @Observable — нет? [закрытоIOS

Программируем под IOS
Ответить
Anonymous
 Почему ObservableObject показывает «Публикация изменений из фоновых потоков не разрешена», а @Observable — нет? [закрыто

Сообщение Anonymous »

В SwiftUI у меня есть две похожие модели представления:
Версия 1 > с использованием ObservableObject + @Published

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

actor ArticlesService {
func fetchTitle() async throws -> String {
// Simulate a real network call
try await Task.sleep(nanoseconds: 200_000_000)
return "Latest headline"
}
}

final class ViewModel: ObservableObject {
private let service = ArticlesService()

@Published var title = "Loading..."

func refresh() async {
// Hop into the actor for work, then resume here
title = (try? await service.fetchTitle()) ?? "Error"
// ⚠️ ^ Runtime warning appears:
// "Publishing changes from background threads is not allowed; make sure to publish values from the main thread (via operators like receive(on:)) on model updates."
}
}

struct ContentView: View {
@StateObject var vm = ViewModel()

var body: some View {
Text(vm.title)
.task { await vm.refresh() }
}
}
Версия 2 > Макрос @Observable (наблюдение) – без предупреждения

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

 actor ArticlesService {
func fetchTitle() async throws -> String {
try await Task.sleep(nanoseconds: 200_000_000)
return "Latest headline"
}
}

@Observable
final class ViewModel {
private let service = ArticlesService()

var title = "Loading..."

func refresh() async {
title = (try? await service.fetchTitle()) ?? "Error"
// ✅ No warning here
}
}

struct ContentView: View {
@State var vm = ViewModel()

var body: some View {
Text(vm.title)
.task { await vm.refresh() }
}
}
Логика та же (тот же субъект, та же сеть), но версия объединения показывает предупреждение, а версия наблюдения — нет. Почему?
@Observable автоматически отправляет информацию главному действующему лицу?

Подробнее здесь: https://stackoverflow.com/questions/797 ... eads-is-no
Ответить

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

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

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

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

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