I need to send an object using CFNotificationCenterGetDarwinNotifyCenter()
however, I'm noticing that whenever I send a notification using
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);
then I find that in the observer callback, the userInfo dict is NULL. Is there something I am missing here? Is there some other way by which I can possibly send the userInfo object? I was looking at http://nshipster.com/inter-process-communication/ and the Distributed Notifications part, however whenever I use :
CFNotificationCenterRef distributedCenter =
CFNotificationCenterGetDistributedCenter();
then I get an error Invalid Use of Function
error whenever I try it.
If you read the documentation for CFNotificationCenterGetDarwinNotifyCenter
, you'll find this caveat:
Several function parameters are ignored by Darwin notification centers. To ensure future compatibility, you should pass NULL or 0 for all ignored arguments.
userInfo
is one of those parameters. CFNotificationCenter.h
goes into more 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.
Why? Dig a little deeper. The documentation also mentions that this type of notification center is built on the Core OS notify mechanism declared in notify.h
. If you look that up, you'll find that there is only one way to post a notification, by calling notify_post()
, which takes only a single string argument. There is no way to add additional data to the notification. This is a very old and rudimentary IPC mechanism that doesn't know anything about CoreFoundation data structures.
As for CFNotificationCenterGetDistributedCenter
, that isn't available on iOS.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With