NSThread + NSNotification

  • NSThread + NSNotification

    Hallo nochmal,

    ich habe eine Klasse, die einiges intern in Threads löst und an verschiedenen Stellen im Thread Notifications verschickt. Diese fange ich in einem meiner Controller ab und mache in diesen notification handlern GUI Zeug. Eigentlich dürfte das doch kein Problem sein. Ist es aber. Das Programm verhält sich ganz komisch, sobald ich innerhalb meiner Notification Handler zb ein Sheet öffne. Sobald ich dies in dem Handler mit performSelectorOnMainThread mache funktioniert es wie gewünscht.

    Aber das sollte doch normal nicht so sein - oder?
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].
  • Doch. Klingt komisch, ist aber so.

    Ich hab die Seite bei Apple nicht im Kopf, aber da steht sinngemäss sowas wie "GUI Elemente sind nicht Threadsafe"

    Deshalb musst Du jede Änderung im GUI, wie Du ja schon geschrieben hat, in ein "performSelectorOnMainThread" packen.

    Alex
    The only thing that really worried me was the ether.
  • RE: NSThread + NSNotification

    Wenn du die Notifications "unmittelbar" verschickst, ist das nur ein verdeckter Nachrichtenevrsand, der zu einem ganz normalen Methodenaufruf führt. Der Controller läuft dann im nebenläufigen Thread.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Original von Objcler
    Danke euch. Ist ja eigentlich logisch, dass die Notifications nicht irgendwie wieder synchronisiert werden...

    Fand ich nicht als ich das mal vor einer Weile erfahren mußte. Fällt meiner Meinung nach in die Kategorie "muß man akzeptieren".
    if (!exit(-1)) fprintf(stderr, "exit call failed. Program will continue\n");
  • Moment, wenn du die Notification direkt abarbeiten lässt, dann ist das doch klar. Wie soll das sonst funktionieren?

    Wenn du sie dispatcht, werden sie wohl in der Main-Run-Loop landen und in dem main Thread abgehandelt werden. Wäre mal einen versuch wert.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • RE: NSThread + NSNotification

    Das hier kann dir Nüztlich sein!

    Es erweitet NSNotificationCenter und NSNotificationQueue um Methoen die den post im main Thread machen (Habe ich mal im Netz gefunden). Die Dinger sind z.B. auch äußerst nützlich wenn man JNI zu tun hat und die guten JavaEntwickler sich einen Dreck um GUI Thread scheren :)
  • sobald ich innerhalb meiner Notification Handler zb ein Sheet öffne


    Ich würde mal wieder auf die RunLoop tippen. Die Notification wird ja irgendwie in deinem Neuen Thread "gefeuert". Das NotificationCenter wird die Methode ausführen, die du registriert hast, und zwar direkt von dinem Thread aus. Ein Sheet fügt sich ja als input source in die RunLoop ein. Dein handler wird aber von einem anderen Thread ausgeführt, der hat eine eigene RL. Fertig ist das Durcheinander.
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.