Как правильно отобразить объекты результатов RealmDB в списки SwiftUI? - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь отобразить результаты запроса realmdb в списке SwiftUI, но у меня возникают проблемы при удалении объектов базы данных.

Я пытаюсь использовать что-то вроде этого:

final class DBData: ObservableObject{

let didChange = PassthroughSubject<DBData, Never>()

private var notificationTokens: [NotificationToken] = []
var events = try! Realm().objects(ADMEvent.self)
@Published var events: [ADMEvent] = []
init() {
    // Observe changes in the underlying model
    self.notificationTokens.append(posts.observe { _ in
        self.events = Array(self.posts)
        self.didChange.send(self)
    })
}
}

, что работает, если я отображаю элементы в списке, но в тот момент, когда я использую realm.deleteAll (), приложение вылетает, потому что оно выглядит какРеализация списка в Swift UI пытается изменить список, получая доступ к недействительным объектам db области.

Есть примерно 3 или 4 похожих вопроса о переполнении стека, но все они так или иначе устарели или работают, но все же имеют эту проблему, когда дело доходит до удаления.

Спасибо!

1 Ответ

0 голосов
/ 26 октября 2019

Realm объекты являются живыми автообновления, поэтому они терпят крах, когда вы пытаетесь удержать удаленный объект. Вместо предоставления субъекту публикации объект Realm.Object сопоставляет его со структурой, содержащей только те поля, которые необходимо использовать, и используйте этот массив для управления SwiftUI.

struct Event: Identifiable {
  var id: String
  var name: String
  var date: Date
}

final class DBData: ObservableObject {
private var notificationTokens: [NotificationToken] = []
var events = try! Realm().objects(ADMEvent.self)
@Published var publishedEvents: [ADMEvent] = []
init() {
    // Observe changes in the underlying model
    self.notificationTokens.append(posts.observe { _ in
        self.publishedEvents = events.map { Event(id: $0.id, name: $0.name, date: $0.date)}
    })
}
}
...