WiftData ModelActor Block Block пользовательский интерфейс, несмотря на то, что работает на фоновом потокеIOS

Программируем под IOS
Ответить
Anonymous
 WiftData ModelActor Block Block пользовательский интерфейс, несмотря на то, что работает на фоновом потоке

Сообщение Anonymous »

Я использую SwiftData с @modelactor для выполнения операций с базой данных в фоновом потоке, но мой пользовательский интерфейс все еще становится не отвечающим при выполнении больших операций, таких как создание или удаление многих элементов. Я не могу перемещаться между вкладками или взаимодействовать с пользовательским интерфейсом во время выполнения этих операций.
Я думал, что использование @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]
Ответить

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

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

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

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

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