Notification die es nur unter 10.9 gibt - Abfrage für ältere OS X notwendig?

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

  • Notification die es nur unter 10.9 gibt - Abfrage für ältere OS X notwendig?

    Hallo,

    Eine meiner MacOS Apps läuft unter 10.7 aufwärts und verwendet iCloud. Seit OS X 10.9 verfügt iCloud/Core Data über die Notification NSPersistentStoreCoordinatorStoresWillChangeNotification die ich gerne verwenden würde.

    Quellcode

    1. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(documentContentsChanged:) name:NSPersistentStoreCoordinatorStoresWillChangeNotification object:coordinator];


    Ist der Aufruf auch für ältere OS X Versionen gültig? Die App wird mit dem 10.9er SDK compiliert, wo der Wert NSPersistentStoreCoordinatorStoresWillChangeNotification also bekannt ist. Ich denke zur Laufzeit wird einfach eine Notfication mit einem Namen XYZ (oder wozu immer NS... auch übersetzt wurde) eingerichtet. Unter älteren OSX Versionen wird nie eine solche Notification ausgelöst, ansonsten sollte es zu keinen Problemen kommen. Ist das richtig?
  • Mit dem richtigen SDK kompiliert läuft das auch auf älteren Versionen.
    Wie Du schon vermutest wird dort die Notification vermutlich einfach nicht losgeschickt.

    (Es ist natürlich durchaus möglich, dass es diese Notification bereits vorher 'privat' gab und erst jetzt dokumentiert wurde.)

    Mit Problemen ist jedenfalls nicht zu rechnen.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Du darfst die Konstante NSPersistentStoreCoordinatorStoresWillChangeNotification in Deinem Code nicht verwenden. Das entsprechende Symbol ist auf älteren Systemen nicht vorhanden. Du kannst jedoch stattdessen eine selbstdefinierte Stringkonstante mit gleichem Inhalt verwenden.
    „Meine Komplikation hatte eine Komplikation.“
  • Wenn der Compiler vom 10.9 SDK kompiliert, dann wird doch NSPersistentStoreCoordinatorStoresWillChangeNotification in den entsprechenden String @"ApplesLustigerStringFürDiePersistentStoreCoordinatorStoresWillChangeNotificiation" umgebogen.

    Zur Laufzeit wird dann doch gar nicht mehr auf die Konstante zugegriffen.

    Ach ja, der blöde Sanity Check beim Cross Compiling – da war ja was. Mein Fehler.
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Manfred Kreß schrieb:

    Der Compiler wird maulen weil er in Versionen < 10.9 das Symbol nicht kennt. Du wirst was tun müssen um ne Alternative zu haben

    Quellcode

    1. #ifdef NSPersistentStoreCoordinatorStoresWillChangeNotification
    2. // register Notification
    3. #else
    4. // fallback
    5. #endif


    Gruß
    Manfred

    Das funktioniert aus zwei Gründen nicht:
    1. NSPersistentStoreCoordinatorStoresWillChangeNotification ist eine Konstante und kein Makro.
    2. Bekommst Du damit betriebssystem-abhängigen Code. Du musst damit dann zwei unterschiedliche Apps bauen.
    „Meine Komplikation hatte eine Komplikation.“
  • Marco Feltmann schrieb:

    Wenn der Compiler vom 10.9 SDK kompiliert, dann wird doch NSPersistentStoreCoordinatorStoresWillChangeNotification in den entsprechenden String @"ApplesLustigerStringFürDiePersistentStoreCoordinatorStoresWillChangeNotificiation" umgebogen.

    Nein, das erfolgt erst beim Binden zum Programmstart.

    Marco Feltmann schrieb:

    Zur Laufzeit wird dann doch gar nicht mehr auf die Konstante zugegriffen.

    Das ist leider nicht richtig: das würde nämlich bedeuten, dass der Compiler die Konstante aus der Bibliothek in den Objektcode des Programms kopieren müsste.
    „Meine Komplikation hatte eine Komplikation.“
  • Mmmh, also doch nicht so einfach wie gedacht. Die Notification gibt es erst ab 10.9 und entsprechend macht es auch erst dort Sinn diese einzurichten um darauf zu reagieren. Gibt denn überhaupt die Möglichkeit NSPersistentStoreCoordinatorStoresWillChangeNotification zu verwenden:

    Quellcode

    1. if (OSX >= 10.0) {
    2. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(documentContentsChanged:) name:NSPersistentStoreCoordinatorStoresWillChangeNotification object:coordinator];
    3. } else {
    4. // Dann halt nicht...
    5. }


    Wäre dieser Code unter 10.8 zulässig (bis auf den Test der OS Version natürlich) oder kommt es schon zu Problemen nur weil NSPersistentStoreCoordinatorStoresWillChangeNotification im Code vorkommt? Wie würde man das sonst lösen?

    Wenn die Lösung OK ist bleibt die Frage wie man die OS Version testen und als Bedingung verwenden kann. Ich habe dazu zwar zahlreiche Beitrage gefunden, aber mit dem Wegfall der Gestalt-API in 10.8 scheint es keine echte Lösung mehr zu geben. Was hilft mir zudem eine Abfrage die bis 10.8 ein korrektes Ergebnis liefert und dann z.B. unter 10.9 nicht funktioniert...