Мое приложение содержит ресурсоемкую операцию, которая заполняет массив на основе данных, извлеченных из канала XML. Я не хочу, чтобы эта операция блокировала основной поток (и пользовательский интерфейс, когда массиву передаются новые данные), поэтому это делается в фоновом режиме.
let dispatchQueue = DispatchQueue(label: "concurrent.queue", qos: .utility, attributes: .concurrent)
class XMLHandler: ObservableObject {
let context: NSManagedObjectContext
@Published var myArray: [CustomObject] = []
init(context: NSManagedObjectContext) {
self.context = context
}
...some code...
func populateArray {
dispatchQueue.async {
...xml parsing happens...
(xmlOutputObject) in
for x in xmlOutputObject {
self.myArray.append(x) }
}
В другом месте мой SwiftUI View использует myArray для заполнения списка:
struct MyView: View {
@EnvironmentObject var handler: XMLHandler
var body: some View {
List{
ForEach(handler.myArray) { CustomObject in
... generate rows ...
}
}
}
Моя ошибка во время выполнения возникает, когда мое приложение пытается обновить @Published var myArray: [CustomObject] = [].
Публикация изменений из фоновых потоков не допускается; Обязательно публикуйте sh значения из основного потока (через операторы, такие как receive (on :)) при обновлении модели.
Я знаю, что это как-то связано с принятием Combine, но я честно понятия не имею, с чего начать. Мы будем благодарны за любую помощь.
Я просто хочу, чтобы произошло следующее:
- Пользователь нажимает кнопку, которая запускает XML извлечение данных, которое заполняет myArray
- myArray заполняется в фоновом потоке, поддерживая отзывчивость пользовательского интерфейса
- Список в MyView автоматически обновляется по завершении задачи. В настоящее время мне нужно отойти от вида и вернуться назад, чтобы список обновился sh.