Задача SwiftUI блокирует пользовательский интерфейс ⇐ IOS
-
Anonymous
Задача SwiftUI блокирует пользовательский интерфейс
Я пытаюсь визуализировать сложное представление, а также создать и отобразить PDF-файл на основе этого визуализированного содержимого.
Я запускаю это нажатием кнопки, и когда задача будет завершена, я хочу отобразить лист с PDF-файлом.
Я хочу отобразить ProgressView во время этого процесса, однако замечаю, что основной пользовательский интерфейс блокируется, несмотря на Task/Async/Await с SwiftUI.
Ниже приведен минимально воспроизведенный пример того, чего я пытаюсь достичь:
struct ContentView: Просмотр { let array = ["один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять", "десять", "одиннадцать", "двенадцать" ", "тринадцать", "четырнадцать", "пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать", "двадцать"] @State varideProgressView = true @State var pdfURL: URL? var body: some View { ВСтек { если !hideProgressView { ПрогрессВью() .progressViewStyle(.circular) .padding(.дно) } Кнопка { скрытьПрогрессВью = ложь Задача { ожидайте рендервиев() скрытьПрогрессВью = истина // показываем PDF } } этикетка: { Текст("Создать PDF") } .buttonStyle(.borderedProminent) } } @Главный актер func renderView() асинхронный { let url = URL.documentsDirectory.appending(путь: "output.pdf") var box = CGRect (x: 0, y: 0, ширина: 200, высота: 200) Guard let pdf = CGContext(url as CFURL, mediaBox: &box, nil) else { возвращаться } для элемента в массиве { pdf.beginPDFPage(ноль) let renderer = ImageRenderer(content: Текст(пункт) ) renderer.render { размер, контекст в контекст(pdf) } pdf.endPDFPage() } PDF.closePDF() pdfURL = URL } } Это не слишком хорошо показывает задержку, но в более сложном представлении, для рендеринга которого требуется некоторое время, блокировка пользовательского интерфейса является значительной, а ProgressView никогда не отображается.
Я пытался использовать глобальную очередь и отправлять в фоновый режим, но тогда не могу нарисовать представление без сбоев. Мне интересно, как лучше всего визуализировать представление в формате PDF, не блокируя основной пользовательский интерфейс или, по крайней мере, имея возможность отображать ProgressView во время выполнения операции.
Я пытаюсь визуализировать сложное представление, а также создать и отобразить PDF-файл на основе этого визуализированного содержимого.
Я запускаю это нажатием кнопки, и когда задача будет завершена, я хочу отобразить лист с PDF-файлом.
Я хочу отобразить ProgressView во время этого процесса, однако замечаю, что основной пользовательский интерфейс блокируется, несмотря на Task/Async/Await с SwiftUI.
Ниже приведен минимально воспроизведенный пример того, чего я пытаюсь достичь:
struct ContentView: Просмотр { let array = ["один", "два", "три", "четыре", "пять", "шесть", "семь", "восемь", "девять", "десять", "одиннадцать", "двенадцать" ", "тринадцать", "четырнадцать", "пятнадцать", "шестнадцать", "семнадцать", "восемнадцать", "девятнадцать", "двадцать"] @State varideProgressView = true @State var pdfURL: URL? var body: some View { ВСтек { если !hideProgressView { ПрогрессВью() .progressViewStyle(.circular) .padding(.дно) } Кнопка { скрытьПрогрессВью = ложь Задача { ожидайте рендервиев() скрытьПрогрессВью = истина // показываем PDF } } этикетка: { Текст("Создать PDF") } .buttonStyle(.borderedProminent) } } @Главный актер func renderView() асинхронный { let url = URL.documentsDirectory.appending(путь: "output.pdf") var box = CGRect (x: 0, y: 0, ширина: 200, высота: 200) Guard let pdf = CGContext(url as CFURL, mediaBox: &box, nil) else { возвращаться } для элемента в массиве { pdf.beginPDFPage(ноль) let renderer = ImageRenderer(content: Текст(пункт) ) renderer.render { размер, контекст в контекст(pdf) } pdf.endPDFPage() } PDF.closePDF() pdfURL = URL } } Это не слишком хорошо показывает задержку, но в более сложном представлении, для рендеринга которого требуется некоторое время, блокировка пользовательского интерфейса является значительной, а ProgressView никогда не отображается.
Я пытался использовать глобальную очередь и отправлять в фоновый режим, но тогда не могу нарисовать представление без сбоев. Мне интересно, как лучше всего визуализировать представление в формате PDF, не блокируя основной пользовательский интерфейс или, по крайней мере, имея возможность отображать ProgressView во время выполнения операции.
Мобильная версия