Я думал, что использование @modelactor автоматически обрабатывает фоновые потоки и сохраняет отзывчивый пользовательский интерфейс, но это не так.
Код: Выделить всё
import SwiftData
import SwiftUI
@main
struct TestingSwiftDataActorsApp: App {
@State private var swiftDataManager = SwiftDataManager()
var body: some Scene {
WindowGroup {
TabView {
Tab("Hello", systemImage: "person") {
ContentView()
}
Tab("World", systemImage: "person") {
Text("Hello")
}
}
.environment(swiftDataManager)
}
}
}
struct ContentView: View {
@Environment(SwiftDataManager.self) private var swiftDataManager
@State private var items: [Item] = []
var body: some View {
NavigationStack {
List(items) { item in
Text(item.id.uuidString)
}
.toolbar {
ToolbarItem {
Button("Create Items", systemImage: "plus") {
Task { await createItems() }
}
}
ToolbarItem {
Button("Delete All", systemImage: "trash") {
Task { await deleteAllItems() }
}
}
}
.task {
items = await swiftDataManager.fetchItems()
}
.overlay {
if items.isEmpty {
Text("No Items")
}
}
}
}
func createItems() async {
await swiftDataManager.createItems(count: 100000)
items = await swiftDataManager.fetchItems()
}
func deleteAllItems() async {
await swiftDataManager.deleteAllItems()
items = await swiftDataManager.fetchItems()
}
}
@Observable
class SwiftDataManager {
private let container: ModelContainer
private let swiftDataActor: SwiftDataActor
init() {
do {
let schema = Schema([Item.self])
self.container = try ModelContainer(for: schema, configurations: [])
self.swiftDataActor = SwiftDataActor(modelContainer: container)
} catch {
fatalError("This should not be happening...")
}
}
func fetchItems() async -> [Item] {
do {
return try await swiftDataActor.fetchItems()
} catch {
return []
}
}
func createItems(count: Int) async {
do {
try await swiftDataActor.createItems(count: count)
} catch {
}
}
func deleteAllItems() async {
do {
try await swiftDataActor.deleteAllItems()
} catch {
}
}
}
@ModelActor
actor SwiftDataActor {
func fetchItems() throws -> [Item] {
let descriptor = FetchDescriptor()
return try modelContext.fetch(descriptor)
}
func createItems(count: Int) throws {
for _ in 0.. < /ul>
Когда я нажимаю на «Создание элементов» (которые создают 100 000 элементов) или «удалить все»: < /p>
Полного пользовательского интерфейса полностью не отвечает < /li>
Я не могу переключать вкладки < /li>
. Операция < /li>
< /ul>
Я использую @modelactor, который должен выполнять операции в фоновом потоке, и я звоню в операции с ожиданием в задаче. Тем не менее, кажется, что пользовательский интерфейс все еще ждет завершения этих операций, прежде чем снова станет адаптивным. Вызовы?
[/list]
Подробнее здесь: [url]https://stackoverflow.com/questions/79736052/swiftdata-modelactor-operations-block-ui-despite-running-on-background-thread[/url]
Мобильная версия