proceed after successful save in CloudKit

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

  • proceed after successful save in CloudKit

    Und hier bin ich wieder .....

    Ich speichere meine Daten direkt in der Cloud mit CloudKit. Speichern, Abrufen, Löschen etc. aus einer View heraus alles toll.

    Quellcode

    1. func saveItem(record: CKRecord, recordTypeString: String, sortKey: String = "name") {
    2. print("func saveItem '\(recordTypeString)', record '\(record)'")
    3. CKContainer.default().publicCloudDatabase.save(record) { [weak self] returnedRecord, returnedError in
    4. // DispatchQueue.main.asyncAfter(deadline: .now() + 3.0) {
    5. DispatchQueue.main.async {
    6. self?.fetchItems(recordTypeString: recordTypeString, sortKey: sortKey)
    7. }
    8. }
    9. }




    Nun möchte ich ein Array einlesen und direkt Zeile für Zeile in der Cloud speichern:

    Quellcode

    1. let data: [[String]] =
    2. [
    3. // customer, discipline, category, practice, month, video, picture
    4. ["Customer1", "U12-U14", "Schlagertechniken", "Vorhand Technik", "EndeAugust", "v1", "p1"],
    5. ["Customer1", "U12-U14", "Schlagertechniken", "Rückhand Technik", "MitteDesJahres", "v2", "p2"],
    6. .....
    7. ]
    Von diesen Zeilen habe ich hunderte .....

    Das Einlesen und Speichern funktioniert alles :thumbsup:

    Nun möchte ich jedoch, dass vor dem Speichern eines Datensatzes z.B. der Monat überprüft werden soll, es es diesen schon in der DB gibt:


    Quellcode

    1. var uuidMonth = UUID().uuidString
    2. if (!vmCKDb.months.contains{ $0.name.lowercased() == "\(customerItemField[4].lowercased())" }) {
    3. // recordFields: description, name, order, uuid
    4. vmCKDb.addButtonPressed(
    5. recordTypeString: "Months",
    6. recordFieldValues: ["description month", "\(customerItemField[4])", orderString, "\(uuidMonth)"],
    7. sortKey: "order"
    8. )
    9. } else {
    10. uuidMonth = (vmCKDb.months.filter{ ($0.name == "\(customerItemField[4])") }.first)!.uuid
    11. print("month already exists")
    12. }
    Alles anzeigen
    Auch das funktioniert alles ohne Probleme.

    Nun aber !!!!!!!

    Wenn ich das Array einlesen und nacheinander abarbeite, dann das das alles so schnell, dass das fetch in Zeile 7 des ersten Codes noch gar nicht den neuen Eintrag in der DB lesen kann, weil dieser (wahrscheinlich) noch nicht weggeschrieben ist. Ich möchte das fetch erst ausführen, wenn das vorherige "CKContainer.default().publicCloudDatabase.save(record)" erfolgreich in der Datenbank gespeichert wurde und über ein fetch abgerufen werden könnte.

    Ich habe das was mit async etc gelesen, finde jedoch keine Lösung, wie und wo ich es bei mir in der saveItem Funktion nutzen kann.

    Hat da mal jemand wieder einen Tip/Hinweis für mich?
    :evil: ;( :( ... aller Anfang ist schwer ... ?( <X :evil:
  • freelancer schrieb:


    Ich habe das was mit async etc gelesen, finde jedoch keine Lösung, wie und wo ich es bei mir in der saveItem Funktion nutzen kann.

    Hat da mal jemand wieder einen Tip/Hinweis für mich?
    "Async await" in Swift ist dazu da eine Funktion als asynchrone Funktionen zu Taggen und bei Aufruf wartet das Programm darauf, dass die Funktion ihre Arbeit erledigt hat..
    Früher gab es (bzw. gibt es immer noch) CompletionHandler, die du dann von der Funktion zurück erhalten hast.. Sozusagen als "Flag", die du in der Funktion gesetzt hast, damit klar ist, dass alle Arbeiten erledigt wurden.

    Die Verwendung von async/await in Swift besteht aus zwei Hauptteilen: der Deklaration einer asynchronen Funktion mit dem Schlüsselwort "async" und der Verwendung des Schlüsselworts "await", um die Ausführung von asynchronem Code zu synchronisieren.

    Hier zwei Beispiele...
    avanderlee.com/swift/async-await/
    hackingwithswift.com/swift/5.5/async-await

    Sollte dir bei deinem Problem helfen.
  • Wahrscheinlich stolperst du über die Leseeinstellungen der DB. Vermute mal, die ist auf Dirty Read gesetzt…
    … aber warum validierst du nicht den ganzen haufen, bevor du den in die DB lädst? Da hast doch alles, die DB und alle Änderungen….
    … das konsolidieret einfach davor, und kannst den Rest direkt in die DB hochladen…
    … und das geht am Schluss sogar noch schneller…
  • Ich weiß gar nicht, wie blöd man manchmal sein kann .... ?( ?( ?(

    Ich habe immer alles direkt in die CloudKit DB geschrieben und habe meine Variablen für das Datenmodell mit einem fetch aktualisiert.

    Ich mache das fetch nun nur noch einmal am Anfang, beim Starten der App, und aktualisiere direkt meine Variablen mit dem Datenmodell. Es kann manchmal so einfach sein!

    Oder stellt man sich teilweise nur blöde an? Oder sieht man manchmal den Wald vor lauter Bäume nicht?

    Ich habe früher immer alles in Dictionaries gespeichert und hatte dort immer alle aktuellen Daten! Nun sind es die Variablen für das Datenmodell!


    Wolf, Du hast mich mit dem Hinweis "Da hast doch alles, die DB und alle Änderungen" auf den richtigen Weg gebracht.

    Tausend Dank an Dich. Hat mich nun 5 Minuten gekostet und läuft sauber durch. Und ist sehr schnell :thumbsup:


    Ich liebe dieses Forum <3 <3 <3
    :evil: ;( :( ... aller Anfang ist schwer ... ?( <X :evil: