Как я могу отправить пользовательскую информацию, используя CFNotificationCenterGetDarwinNotifyCenter()

Мне нужно отправить объект, используя 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 ответ

Решение

Если вы читаете документацию для CFNotificationCenterGetDarwinNotifyCenter вы найдете это предостережение:

Дарвинские центры уведомлений игнорируют некоторые параметры функции. Чтобы обеспечить совместимость в будущем, вы должны передать 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.

Зачем? Копай немного глубже. В документации также упоминается, что этот тип центра уведомлений основан на механизме уведомлений ОС Core, объявленном в notify.h, Если вы посмотрите это, вы обнаружите, что есть только один способ опубликовать уведомление, позвонив notify_post(), который принимает только один строковый аргумент. Нет возможности добавить дополнительные данные в уведомление. Это очень старый и элементарный механизм IPC, который ничего не знает о структурах данных CoreFoundation.

Что касается CFNotificationCenterGetDistributedCenter, это не доступно на iOS.

Другие вопросы по тегам