如何使用CFNotificationCenterGetDarwinNotifyCenter()发送userInfo dict

时间:2016-05-16 03:00:21

标签: ios core-foundation cfnotification

我需要使用CFNotificationCenterGetDarwinNotifyCenter()发送对象,但是,每当我使用

发送通知时,我都会注意到
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);

然后我发现在观察者回调中,userInfo dict为NULL。这里有什么我想念的吗?是否有其他方式可以发送userInfo对象?我正在查看http://nshipster.com/inter-process-communication/和分布式通知部分,但无论何时我使用:

CFNotificationCenterRef distributedCenter =
CFNotificationCenterGetDistributedCenter();

然后每当我尝试时都会收到错误Invalid Use of Function错误。

1 个答案:

答案 0 :(得分:10)

如果您阅读the documentation for CFNotificationCenterGetDarwinNotifyCenter,您会发现此警告:

  

Darwin通知忽略了几个函数参数   中心。为确保将来的兼容性,您应该传递NULL或0   所有被忽略的论点。

userInfo是其中一个参数。 CFNotificationCenter.h详细介绍:

// 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.

为什么呢?深入挖掘一下。该文档还提到这种类型的通知中心是基于notify.h中声明的Core OS通知机制构建的。如果您仔细查看,您会发现只有一种方法可以通过调用notify_post()来发布通知,这只需要一个字符串参数。无法向通知添加其他数据。这是一个非常古老而基本的IPC机制,它对CoreFoundation数据结构一无所知。

至于CFNotificationCenterGetDistributedCenter,这在iOS上不可用。