UI friert ein beim Ausführen verschiedener Funktionen

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

  • UI friert ein beim Ausführen verschiedener Funktionen

    Hallo,

    ich habe in meiner ViewController.swift einige Funktionen, die ich nacheinander ausführen möchte. Konkret geht es um die Weiterverarbeitung eines Strings. Bisher gehe ich wie folgt vor

    Quellcode

    1. meinString = meinString.funktionDieWasMacht
    2. meinString = meinString.nochEineFunktion
    3. meinString = meinString.dritteFunktion


    Innerhalb der Funktionen aktualisiere ich ein TextField im Interface. Das Problem: Beim Ausführen der Funktionen bekomme ich den Beachball-Cursor und das Interface friert ein. Alle Änderungen die ich im Interface vornehme sind erst nach abgeschlossener Ausführung der Funktionen sichtbar.

    Ich habe es daraufhin mit Folgendem versucht

    Quellcode

    1. dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)){
    2. meinString = meinString.funktionDieWasMacht
    3. }

    ... verursache damit aber leider einen Crash.

    Da die Funktionen aufeinander aufbauen, müssen diese zwangsweise nacheinander abgearbeitet werden. Wie kann ich das erreichen, ohne dass die UI einfriert?
  • Danke. Genau an der Stelle bin ich nicht sicher, wie ich konkret vorgehe.

    Wenn ich die Funktion in der ViewController.swift aufrufe, agiere ich damit ja automatisch im Main-Thread, oder?

    Und ich dachte mit dem dispatch_sync mache ich bereit einen eigenen Thread für die aufwändigeren Funktionen auf...?
  • Funktioniert leider noch nicht wie gewünscht.
    Ich habe nun ein TextField - wenn ich "Enter" betätige, führe ich u.a. eine Funktion auf die ein weiteres TextField befüllen soll.

    Quellcode

    1. func lxPrintLog(message: String) {
    2. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)){
    3. // hier bastle ich einen attributed string zusammen
    4. self.lxConsoleTF.textStorage.setAttributedString(attributedLog)
    5. }
    6. }


    Hier passiert erstmal nichts Aufwändiges. Das Interface aktualisiert sich nun aber nicht mehr automatisch - sondern erst, wenn ich ein das Textfeld klicke. ?(
  • früher hat man das mal so gemacht dass man einen thread gestartet hat (also eine methode in einem neuen NSThread detached). dort drin dann zb ein sleep(5); welches deine 5-sekunden lange berechnung simuliert. danach eben mittels [textfield performSelectorOnMainThread:@selector(setString:) withObject:@"fertig" waitUntilDone:NO]; das textfeld aktualisiert.
    das ganze kann man natürlich auch mit gcd machen!
  • Michael schrieb:

    Wie wir dir bereits gesagt hatten, musst du die Aktualisierungen in der UI im Main-Thread ausführen.


    Wenn ich wüsste wie ich das umsetzen kann, bräuchte ich nicht fragen :/

    mrtn.lxo schrieb:

    ​Wenn ich die Funktion in der ViewController.swift aufrufe, agiere ich damit ja automatisch im Main-Thread, oder?
  • mrtn.lxo schrieb:

    Michael schrieb:

    Wie wir dir bereits gesagt hatten, musst du die Aktualisierungen in der UI im Main-Thread ausführen.


    Wenn ich wüsste wie ich das umsetzen kann, bräuchte ich nicht fragen :/

    mrtn.lxo schrieb:

    ​Wenn ich die Funktion in der ViewController.swift aufrufe, agiere ich damit ja automatisch im Main-Thread, oder?


    ich habs doch geschrieben. entweder das performSelectorOnMainThread oder eben gcd aber dazu gibts jede menge dokumentation die du lesen solltest!