Variablen in Blocks

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

  • Variablen in Blocks

    Ich versuche auf Variablen zu zugreifen. Irgendwie klappt das aber nicht.


    C-Quellcode

    1. __block long monat = 0;
    2. __block long jahr = 0;
    3. dispatch_async(dispatch_get_main_queue(), ^{
    4. monat = self->Outlet_Monat_Eingabe.indexOfSelectedItem + 1;
    5. jahr = [[self->jahren objectAtIndex:self->Outlet_Jahr_Eingabe.indexOfSelectedItem] intValue];
    6. });
    Wenn ich das ohne den Aufruf im Hintergrund mache, erhalte ich die richtigen Werte für monat=1 und jahr=2020. Mit dem Aufruf wie oben erhalte ich nur jeweils 0.

    Wo liegt mein Fehler?
  • Da sind die richtigen Werte zugewiesen.

    Nach dem Block verwende ich diese Werte für eine Datenbankabfrage. Wenn ich das über Logs ausgeben lasse, kommt die Datenbankabfrage eher als die Ausgabe im Block.


    C-Quellcode

    1. __block long monat = 0;
    2. __block long jahr = 0;
    3. dispatch_async(dispatch_get_main_queue(), ^{
    4. monat = self->Outlet_Monat_Eingabe.indexOfSelectedItem + 1;
    5. jahr = [[self->jahren objectAtIndex:self->Outlet_Jahr_Eingabe.indexOfSelectedItem] intValue];
    6. NSLog(@"%li %li", monat, jahr);
    7. });
    8. NSString *abfrageSQL = [NSString stringWithFormat:@"SELECT * FROM umsatzzahlen WHERE monat=%li and jahr=%li ORDER BY mitarbeiter", (long)monat, (long)jahr];
    9. NSLog(@"%@", abfrageSQL);
    10. Datenbank *datenbank = [[Datenbank alloc] init];
    11. return [datenbank holeDaten:abfrageSQL art:7];
    Alles anzeigen
    Ausgabe im Log:
    2020-03-12 18:57:13.262390+0100 LeaAnalyse[813:12885] SELECT * FROM umsatzzahlen WHERE monat=0 and jahr=0 ORDER BY mitarbeiter
    2020-03-12 18:57:13.284553+0100 LeaAnalyse[813:12581] 1 2020
  • Ok, dieser Code war nicht zu sehen. In dem Code Schnipsel werden ja nur Werte aus UI Elementen gelesen.

    Wenn Du diese Werte vorab an anderer Stelle bei den UI Elementen gesetzt hast und diese Werte jetzt aus den UI Elementen verwenden möchtest, dann könntest Du diese doch auch aus dem Datenmodell verwenden, oder?
  • Mit dispatch_sync() klebst du ein Pflaster auf deinen Code und handelst dir neue Probleme ein. Vielleicht nicht sofort, aber mittelfristig schon. Der nette Herr Deadlock wartet schon ungeduldig auf seinen Überraschungsbesuch.

    Der „Fehler“ in deinem Code liegt in der Verwendung von Blockvariablen und dem zugrunde liegenden Antipattern. Wenn du Code im Main-Thread ausführen musst, ist Asynchronität in der Regel eine sehr gute Idee, weil irgendwann alle mal in den Main-Thread wollen.

    Ich würde die Blockvariablen komplett im asynchronen Thread zuweisen und da dann auch das Ergebnis auswerten. Das __block kannst du dann dahin befördern, wo es meistens am besten aufgehoben ist – in die Rundablage.
    „Meine Komplikation hatte eine Komplikation.“