2016-05-16 24 views
3

Ich brauche ein Objekt mit CFNotificationCenterGetDarwinNotifyCenter() jedoch zu schicken, ich bin zu bemerken, dass, wenn ich eine Benachrichtigung mitWie kann ich ein userinfo DIKT CFNotificationCenterGetDarwinNotifyCenter send()

const void *tkeys[1] = { @"testKey" }; 
const void *tvalues[1] = { @"testValue" }; 
CFDictionaryRef userInfo = CFDictionaryCreate(NULL, tkeys, tvalues, 1, NULL, NULL); 
CFNotificationCenterPostNotification(CFNotificationCenterGetDarwinNotifyCenter(), 
             CFSTR("foo"), 
             object, 
             userInfo, 
             true); 

dann sende ich feststellen, dass in dem Beobachter Rückruf , das userInfo-dict ist NULL. Gibt es etwas, das mir hier fehlt? Gibt es eine andere Möglichkeit, wie ich das userInfo-Objekt senden kann? Ich war auf der Suche auf http://nshipster.com/inter-process-communication/ und der Distributed Benachrichtigungen Teil, aber wenn ich verwende:

CFNotificationCenterRef distributedCenter = 
CFNotificationCenterGetDistributedCenter(); 

dann erhalte ich einen Fehler Invalid Use of Function Fehler, wenn ich es versuchen.

Antwort

6

Wenn Sie the documentation for CFNotificationCenterGetDarwinNotifyCenter lesen, werden Sie diese Einschränkung finden:

Mehrere Funktionsparameter ignoriert werden von Darwin Benachrichtigung Zentren. Um zukünftige Kompatibilität zu gewährleisten, sollten Sie NULL oder 0 für alle ignorierten Argumente übergeben.

userInfo ist einer dieser Parameter. CFNotificationCenter.h geht ins Detail:

// For this center, there are limitations in the API. There are no notification "objects", 
// "userInfo" cannot be passed in the notification, ... 
// - CFNotificationCenterPostNotification(): the 'object', 'userInfo', and 'deliverImmediately' arguments are ignored. 

Warum? Grabe etwas tiefer. In der Dokumentation wird auch erwähnt, dass diese Art von Benachrichtigungszentrale auf dem Core-OS-Benachrichtigungsmechanismus basiert, der in notify.h deklariert wurde. Wenn Sie nachsehen, werden Sie feststellen, dass es nur eine Möglichkeit gibt, eine Benachrichtigung zu posten, indem Sie notify_post() aufrufen, was nur ein einziges String-Argument erfordert. Es gibt keine Möglichkeit, der Benachrichtigung zusätzliche Daten hinzuzufügen. Dies ist ein sehr alter und rudimentärer IPC-Mechanismus, der nichts über CoreFoundation-Datenstrukturen weiß.

Wie für CFNotificationCenterGetDistributedCenter, das ist nicht für iOS verfügbar.

+0

Vielen Dank. Das ist eine fantastische Antwort. –