Check ob Webseite erreichbar ist

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

  • Check ob Webseite erreichbar ist

    Hallo,

    ich schreibe an einer simplen App, die mir Ravencore HAA HomeKit Devices anzeigen soll und ob deren Setup Webseite erreichbar ist oder nicht. Ravencore HAA Devices können in einen Setup Modus versetzt werden, in dem man dann z.B. die WiFi Einstellungen verändern kann, oder die Konfiguration des Gerätes im allgemeinen.

    Ich habe derzeit diesen Code am laufen:


    Quellcode

    1. func checkURL(hostname:String, ipadress:String) {
    2. let dataURL = "http://\(ipadress)"
    3. let request = URLRequest(url: URL(string: dataURL)!)
    4. URLSession.shared.dataTask(with: request) { (data, response, error) in
    5. // Check if the response has an error
    6. var filteredDevice:[NSManagedObject] = []
    7. let request = Device.fetchRequest() as NSFetchRequest<Device>
    8. let predicate = NSPredicate(format: "hostname == %@", hostname)
    9. request.predicate = predicate
    10. do {
    11. filteredDevice = try self.managedObjectContext.fetch(request)
    12. } catch {
    13. print(error)
    14. }
    15. if error != nil{
    16. filteredDevice.first?.setValue(false, forKey: "reachable")
    17. do {
    18. try self.managedObjectContext.save()
    19. } catch {
    20. print(error)
    21. }
    22. return
    23. }
    24. if let httpResponse = response as? HTTPURLResponse{
    25. if httpResponse.statusCode == 200 {
    26. filteredDevice.first?.setValue(true, forKey: "reachable")
    27. } else {
    28. filteredDevice.first?.setValue(false, forKey: "reachable")
    29. }
    30. print("HTTP Status: \(httpResponse.statusCode)")
    31. }
    32. do {
    33. try self.managedObjectContext.save()
    34. } catch {
    35. print(error)
    36. }
    37. // Get data success
    38. }.resume()
    39. }
    Alles anzeigen
    Die Daten werden also in CoreData gespeichert. Problem ist allerdings, das die CPU Last im Simulator bei 120-150% liegt und dadurch die App nicht wirklich bedienbar ist, solange die Überprüfung auf Erreichbarkeit läuft.
    Ich suche nach einer einfacheren Möglichkeit zu prüfen ob die Seite nicht erreichbar ist, als die meine, die nicht die CPU auslastet. Ich möchte die Funktion alle 10-15 Sekunden laufen lassen.

    Wäre toll wenn mir jemand einen Tipp geben könnte.

    Danke.
  • Oh ich sehe gerade deinen Quellcode. Den hab ich übersehen gestern. Du bist ja schon Async.

    Ich denke dann ist dein Problem, dass du zu viele Calls absetzt. Also du solltest mindestens warten, bis der Call fertig ist und erst dann einen neuen Starten. Noch besser wäre es nachdem der Call fertig wird noch mal ein paar Sekunden zu warten. Auch solltest du dir überlegen, ob du echt in solchen Abständen abfragen musst. Sinnvoller scheint mir eine Minute und dafür ein Button für die manuelle Abfrage.

    Prüfe bitte auch noch mal, ob nicht deine App abstürzt und dann in Debugger hängen bleibt. Denn CoreData und Hintergrund Thread sind nicht die besten Freunde.
  • AppleDeveloper schrieb:

    Prüfe bitte auch noch mal, ob nicht deine App abstürzt und dann in Debugger hängen bleibt. Denn CoreData und Hintergrund Thread sind nicht die besten Freunde.
    @AppleDeveloper Ja, irgendwie bleibt die manchmal hängen, stürzt aber im Simulator nicht wirklich ab. Also App bleibt auf aber reagiert auf nichts. Auf dem Handy via TestFlight kommt nach erneutem start dann tatsächlich die Abfrage ob man den Crash teilen möchte.

    Wie kann ich denn herausfinden, wann der Async Thread fertig ist, das ich danach einfach alles in CoreData schreibe?
  • Hi,

    du führst ja gerade dein CoreData im Background-Thread aus. Versuch mal um das CoreData Zeug folgendes drumherum zu schreiben:

    C-Quellcode

    1. DispatchQueue.main.async {
    2. //Hier CoreData rein
    3. }
    Das bewirkt, dass du wieder in den MainThread kommst.

    Wenn die App nicht reagiert könnte es aber auch ein Zeichen sein, dass du wie gesagt zu viele Calls absetzt.
  • AppleDeveloper schrieb:

    Hi,

    du führst ja gerade dein CoreData im Background-Thread aus. Versuch mal um das CoreData Zeug folgendes drumherum zu schreiben:

    C-Quellcode

    1. DispatchQueue.main.async {
    2. //Hier CoreData rein
    3. }
    Das bewirkt, dass du wieder in den MainThread kommst.

    Wenn die App nicht reagiert könnte es aber auch ein Zeichen sein, dass du wie gesagt zu viele Calls absetzt.
    Hi @AppleDeveloper,

    danke für die Tipps, ich habe mal die Automatische Abfrage abgeschaltet, und auch beim start frage ich nicht die Erreichbarkeit ab, trotzdem habe ich massive Probleme. Die Liste der Geräte ist gar nicht mehr scrollbar, nur ganz selten und nur für einen Bruchteil von Sekunden, Wechsel ich auf einen anderen Tab geht alles super.

    Vielleicht hat das ja auch mit CoreData und CloudKit zu tun, bzw. daran, das ich CloudKit rausgeworfen habe. Vielleicht habe ich da was falsch gemacht? Bin über jede Idee dankbar, sonst stampfe ich das Projekt ein, es kostet mich zu viel nerven, für ein Hobbyprojekt das nix kosten soll.
  • Ohne jetzt böse klingen zu wollen aber ich denke kaum, dass jemand für dich dein Projekt debugged. Ich denke du hast ein paar Ansätze.

    Weiterhin bietet Xcode dir auch noch Profiling Tools, wo du Analysieren kannst was so viel Zeit verbraucht oder was gerade im Main Thread ausgeführt wird.

    Wenn du da Erkenntnisse hast, kann man weiter helfen.

    Viele Grüße
    Nils