Variablen in Blocks

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

Wir sind Opfer einer Spamattacke geworden. Der Provider hat uns daher vom Netz genommen. Wir hoffen, dass jetzt wieder alles rund läuft. - Sorry für den Ausfall.

  • 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
  • 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.“