SwiftUI Delegates und Coredata

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Rabattcode für die heise MacDev 2020: Macoun20

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.12.2020 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • SwiftUI Delegates und Coredata

    Hallo,

    ich musste es mal wieder Kompliziert haben und dachte mir ich fange mal was mit SwiftUI an. Nette Sache Ansicht, konnte die UI und die CoreData Sachen relativ einfach bauen und habe eine funktionierende App mit Demodaten drin. Nun würde ich gerne "echte" Daten in CoreData schreiben.

    Meine App liest per Bonjour Geräte aus die sich als Homekit Gerät melden. Diese Bonjour Daten (hostname, ipadresse) würde ich gerne in CoreData speichern.

    Ich habe also in SwiftUI in der Datei [Appname]App.swift eine Klasse gemacht die grob so aussieht:

    Quellcode

    1. class DiscoverBonjour: NSObject, NetServiceBrowserDelegate, NetServiceDelegate, UIApplicationDelegate {
    2. @Environment(\.managedObjectContext) private var viewContext
    3. func updateInterface () {
    4. for service in self.services {
    5. if service.port == -1 {
    6. print("service \(service.name) of type \(service.type)" +
    7. " not yet resolved")
    8. service.delegate = self
    9. service.resolve(withTimeout:10)
    10. } else {
    11. if service.addresses!.count > 0 {
    12. let hostnm:String = service.hostName!
    13. let ipadr:String = "\(String(describing: service.addresses![0][4])).\(String(describing: service.addresses![0][5])).\(String(describing: service.addresses![0][6])).\(String(describing: service.addresses![0][7]))"
    14. // MARK: HIER GERÄTE IN COREDATA SCHREIBEN
    15. let nDevice = Device(context: self.viewContext)
    16. nDevice.hostname = hostnm
    17. nDevice.ipadress = ipadr
    18. nDevice.reachable = false
    19. do {
    20. try viewContext.save()
    21. } catch {
    22. print(error)
    23. }
    24. checkURL(hostname: hostnm, url: ipadr)
    25. }
    26. }
    27. }
    28. }
    29. }
    Alles anzeigen
    Immer wenn ich in der Funktion updateInterface() viewContext.save() aufrufe, rennt es in den Catch Block und zeit einen "nilError" an. Was mache ich hier denn falsch?
  • Habe mal tiefer gegraben und im Catchblock nun folgendes drin:


    Quellcode

    1. let nsError = error as NSError
    2. fatalError("Unresolved error \(nsError), \(nsError.userInfo)")
    Das führt mich zu folgender Erkenntnis:

    Fatal error: Unresolved error Foundation._GenericObjCError.nilError, [:]: file HAA_Browser/HAA_BrowserApp.swift, line 59

    Also quasi für mich zu keiner Erkenntnis, aber vielleicht hilft einem von euch?
  • Vielleicht (=mit an Sicherheit grenzender Wahrscheinlichkeit) verstehe ich auch SwiftUI auch nicht richtig. Ich starte die Suche nach Bonjour Geräten in dem ich in meiner Hauptview den .onAppear Modifier benutze:


    Quellcode

    1. import SwiftUI
    2. import CoreData
    3. struct ContentView: View {
    4. @Environment(\.managedObjectContext) private var viewContext
    5. @FetchRequest(
    6. sortDescriptors: [
    7. NSSortDescriptor(keyPath: \Device.reachable, ascending: false),
    8. NSSortDescriptor(keyPath: \Device.alias, ascending: true),
    9. NSSortDescriptor(keyPath: \Device.hostname, ascending: true)],
    10. animation: .default)
    11. private var devices: FetchedResults<Device>
    12. let bnjr = DiscoverBonjour()
    13. var body: some View {
    14. TabView {
    15. MainView()
    16. .tabItem {
    17. Image(systemName: "house")
    18. Text("HAA-Devices")
    19. }
    20. DatabaseView()
    21. .tabItem {
    22. Image(systemName: "gearshape")
    23. Text("Edit Database")
    24. }
    25. }.onAppear(perform: bnjr.startDiscover)
    26. }
    Alles anzeigen
    ist das eventuell falsch?
  • Das ist jetzt ziemlich wie lesen in der Kristallkugel.

    Ich vermute mal, dass du irgendwelche Daten aus dem FetchRequest hast, welche du in einer Liste anzeigen willst um dort die Daten zu verändern und dann zurückzuspeichern.

    Dann mach doch mal für jede Zeile einen eigenen View...
    und übergib dort das Objekt. Hier ist es dann auch bekannt und Du kannst es dann auch Problemlos Zurückspeichern.

    Hoffe, ich hab erraten, was du tun wolltest.

    Schöne Grüsse
    Wolf